// 循环实现数组 filter 方法
const selfFilter = function (fn, context){
// 如果调用的地方使用箭头函数,这里的this岂不是不对了,那该怎么解决呢
let arr = Array.prototype.slice.call(this)
let filterArr = []
for(let i = 0; i < arr.length; i++){
if(!arr.hasOwnProperty(i)){
continue
}
fn.call(context, arr[i], i, this) && filterArr.push(arr[i])
}
return filterArr
} const selfFilter2 = function (fn, context){
return this.reduce((pre, cur, index) => {
// 因为这里是return 的,所以不能像上面用&&实现
return fn.call(context, cur, index, this) ? [...pre, cur] : [...pre]
}, [])
} // 循环实现数组的 some 方法
const selfSome = function (fn, context){
let arr = Array.prototype.slice.call(this)
if(arr.length === 0){
return false
}
for(let i = 0; i < arr.length; i++){
if(!arr.hasOwnProperty(i)){
continue
}
let res = fn.call(context, arr[i], i, this)
if(res){
return true
}
}
return false
} // 循环实现数组的 reduce 方法
const selfReduce = function (fn, initialValue){
let arr = Array.prototype.slice.call(this)
let res
let startIndex
if(initialValue === undefined){
// 找到第一个非空单位(真实)的元素和下标
for(let i = 0; i < arr.length; i++){
if(!arr.hasOwnProperty(i)){
continue
}
startIndex = i
res = arr[i]
break
}
}else{
res = initialValue
} for(let i = ++startIndex || 0; i < arr.length; i++){
if(!arr.hasOwnProperty(i)){
continue
}
res = fn.call(null, res, arr[i], i, this)
}
return res
} // 使用 reduce 实现数组的 flat 方法
// flat()方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
// 参数depth(可选),指定要提取嵌套数组的结构深度,默认值为1
const selfFlat = function (depth = 1){
let arr = Array.prototype.slice.call(this)
if(depth === 0){
return arr
}
return arr.reduce((pre, cur) => {
//[]我之前记忆错了,这个应该是全部都是值,比如[cur],如果是数组的话,应该要先解构,比如[...pre]
// 我之前一直是用的[...pre],却忘记了原本的用处,记录一波
return Array.isArray(cur) ? [...pre, ...selfFlat.call(cur, depth - 1)] : [...pre, cur]
}, [])
} let arr1 = [1, 2, 3, 4]
let arr2 = [1, 2, 3, [1, 5, 6, [2, 4, 5]]]
// 看到上面方法的实现,我才想起,这些方法也可以用call来调用,call第一位 let arrList = selfFilter.call(arr1, function(x){
return x === 1
}) let arrList2 = selfFilter2.call(arr1, function(x){
return x === 1
}) let arrList3 = selfSome.call(arr1, function(x){
return x === 0
}) let arrList4 = selfReduce.call(arr1, function(total, res){
return total + res
}, 0) let arrList5 = selfFlat.call(arr2, Infinity) console.log(arrList)
console.log(arrList2)
console.log(arrList3)
console.log(arrList4)
console.log(arrList5)

循环实现数组filter方法的更多相关文章

  1. 循环实现数组 map 方法

    //循环实现数组 map 方法 const selfMap = function (fn, context) { let arr = Array.prototype.slice.call(this) ...

  2. ES6 必须要用的数组Filter() 方法,不要再自己循环遍历了!!!

    1,来一个最简单最常用的栗子: 获得年龄为9岁的孩子 1 let arr = [ 2 { 3 name:'小明', 4 sex:0, 5 age:9 6 }, 7 { 8 name:'小红', 9 s ...

  3. 数组filter方法对数组元素进行过滤

    Array.prototype.filter对数组中元素进行过滤 /** * @method reduce * @param {number} item 当前迭代的数组元素 * @param {num ...

  4. php中遍历数组的方法

    参考网址:http://www.jb51.net/article/29949.htm 这三种方法中效率最高的是使用foreach语句遍历数组.从PHP4开始就引入了foreach结构,是PHP中专门为 ...

  5. ES6 数组遍历方法的实战用法总结(forEach,every,some,map,filter,reduce,reduceRight,indexOf,lastIndexOf)

    目录 forEach every some map filter reduce && reduceRight indexOf lastIndexOf 前言 ES6原生语法中提供了非常多 ...

  6. 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解(转)

    ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器.     ...

  7. 学好Spark/Kafka必须要掌握的Scala技术点(一)变量、表达式、循环、Option、方法和函数,数组、映射、元组、集合

    前言 Scala是以JVM为运行环境的面向对象的函数式编程语言,它可以直接访问Java类库并且与Java框架进行交互操作.正如之前所介绍,Spark是用Scala语言编写的,Kafka server端 ...

  8. 数组map()方法和filter()方法及字符串startsWith(anotherString)和endsWith(anotherString)方法

    map方法的作用不难理解,"映射"嘛,也就是原数组被"映射"成对应新数组 var newArr = arr.map(function() {});例子: var ...

  9. php遍历循环数组实现方法

    简单利用foreach for list each while来遍历数组,包括普通的一维数组与二维数组遍历方法,下面详细的介绍了每个函数的使用方法. $foreach = array(1,2,3); ...

随机推荐

  1. oppo手机怎么打开USB调试模式

    OPPO手机USB调试的设置方法:1.ColorOS 3.0版本,进入设置--关于手机,连续点击版本号直到出现“您已处于开发者选项”,再进入设置--其他设置--开发者选项--USB调试进行设置: 2. ...

  2. HDOJ4857【拓扑排序】

    首先 CLJ ORZ 这道题做了两次,第一次瞎搞... 第二次,好吧,骄傲地说水过... 题意:不说了: 思路: 题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来: 第一次做的时候,我记得我 ...

  3. 【POJ - 2376】Cleaning Shifts(贪心)

    Cleaning Shifts Descriptions: 原文是English,我这就直接上Chinese了,想看原文的点一下链接哦 大表哥分配 N (1 <= N <= 25,000) ...

  4. notepad++插件选项没有plugin manager解决

    在 https://github.com/bruderstein/nppPluginManager/releases 下载最新的PluginManager_vXXXX_UNI.zip 解压,将里面的p ...

  5. GCD = XOR(GCD XOR )

    首先没看懂XOR(于是百度了一下):异或,英文为exclusive OR,或缩写成xor.同时还有一个OR,于是一起看了一眼: 大意: 输入一个整数n,在1~n内,有多少对整数(a,b)满足GCD(a ...

  6. Hdu 5458 Stability (LCA + 并查集 + 树状数组 + 缩点)

    题目链接: Hdu 5458 Stability 题目描述: 给出一个还有环和重边的图G,对图G有两种操作: 1 u v, 删除u与v之间的一天边 (保证这个边一定存在) 2 u v, 查询u到v的路 ...

  7. 洛谷 P1892 团伙

    P1892 团伙 并查集 #include<cstdio> int fa[2500];//fa[i]表示i的朋友所在集合,fa[i+n]表示i的敌人所在集合 bool boo[2500]; ...

  8. iOS中数据类型转换--遇到则记录

    1.NSString转NSNumber 使用情景:CoreData存储数据,其中一个为价格,CoreData里面定义为float 用文本输入框得到的数据类型是NSString,将NSString转换成 ...

  9. and or类比c中的 bool?a :b

    a = "heaven" b = "hell" c = True and a or b     print c d = False and a or b     ...

  10. Backbone学习记录(6)

    路由 backbone将路由规则和一个方法名绑定到一起,来控制单页的hash,以及单页的前进后退. var UserRouter = Backbone.Router.extend({ routes: ...