// 循环实现数组 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. kafka之四:Kafka集群搭建

    1.软件环境 1.linux一台或多台,大于等于2 2.已经搭建好的zookeeper集群 3.软件版本kafka_2.11-0.9.0.1.tgz 2.创建目录并下载安装软件 #创建目录 cd /o ...

  2. cocos2d-x 坐标系解惑

    1.CCTouch* touch->getLocation() ---- 返回当前触摸点在openGL坐标系中的位置 openGL坐标系,原点在左下角,x向右为正,y向上为正. 2.CCTouc ...

  3. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道

    ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道 语雀: https://www.yuque.com/yuejiangliu/dotnet/ ...

  4. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时8&&9

    课时8 反向传播与神经网络初步(上) 反向传播在运算连路中,这是一种通过链式法则来进行递推的计算过程,这个链路中的每一个中间变量都会对最终的损失函数产生影响. 链式法则通常包含两部分,局部梯度和后一层 ...

  5. Android控件大全(四)——CoordinatorLayout

    CoordinatorLayout 其实就是个高级的FrameLayout,用于协调子布局要使用该控件,需要再gradle中加入: compile 'com.android.support:desig ...

  6. IT兄弟连 JavaWeb教程 Servlet

    Servlet的定义 Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层. 使用Ser ...

  7. childNodes和Children的区别

    1.childNodes: 标准的,返回指定元素的子元素集合,包括HTML属性,所有属性,文本.可以通过nodeType来判断是哪种类型的节点,只有当nodeType==1时才是元素节点,2是属性节点 ...

  8. 数位dp真·浅谈 By cellur925

    预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...

  9. (七)SpringBoot使用PageHelper分页插件

    二:添加PageHelper依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifac ...

  10. PowerDesigner 16.5的下载安装破解注册(图文详解)

    http://blog.csdn.net/chenchunlin526/article/details/54707757