// 循环实现数组 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. Codechef SEPT17

    Codechef SEPT17 比赛链接:https://www.codechef.com/SEPT17 CHEFSUM code给定数组 a[1..n] ,求最小的下标 i ,使得 prefixsu ...

  2. linux中用管道实现父子进程通信

    1 用户要实现父进程到子进程的数据通道,可以在父进程关闭管道读出一端, 然后相应的子进程关闭管道的输入端. 2 先用pipe()建立管道 然后fork函数创建子进程.父进程向子进程发消息,子进程读消息 ...

  3. Hello,Cardboard!!-如何开发一个最简单的Cardboard虚拟现实应用(一)

    [原创文章,转载请注明出处,谢谢 !] 温馨提醒,本篇第一节主要介绍cardboard虚拟现实系统的组成,如果只想看如何开发的具体步骤请直接跳到第二节^_^ 前述:恕我啰嗦一下,主要照顾对cardbo ...

  4. poj3249【拓扑排序】

    //题意:   给出一个有向无环图,每个顶点都有一个权值. //         求一条从入度为0的顶点到出度为0的顶点的一条路径, //         路径上所有顶点权值和最大. //我觉得只要明 ...

  5. bzoj 4530: [Bjoi2014]大融合【LCT】

    新姿势,一般来讲LCT只能维护splay重边里的数据,而这里要求维护整颗子树的size 多维护一个sq表示当前点轻儿子的size和,si表示包括轻重边的整颗子树的大小 然后需要改sq的地方是link和 ...

  6. poj 1182 食物链【带权并查集】

    设相等的边权为0,吃的边权为,被吃的边权为2,然后用带权并查集在%3的意义下做加法即可 关系为简单环的基本都可以用模环长的方式是用带权并查集 #include<iostream> #inc ...

  7. CIFAR10自定义网络实战

    目录 CIFAR10 MyDenseLayer CIFAR10 MyDenseLayer import os import tensorflow as tf from tensorflow.keras ...

  8. hdu 4704 Sum【组合数学/费马小定理/大数取模】By cellur925

    首先,我们珂以抽象出S函数的模型:把n拆成k个正整数,有多少种方案? 答案是C(n-1,k-1). 然后发现我们要求的是一段连续的函数值,仔细思考,并根据组合数的性质,我们珂以发现实际上答案就是在让求 ...

  9. Python入门小练习 002 批量下载网页链接中的图片

    我们常常需要下载网页上很多喜欢的图片,但是面对几十甚至上百张的图片,一个一个去另存为肯定是个很差的体验. 我们可以用urllib包获取html的源码,再以正则表达式把匹配的图片链接放入一个list中, ...

  10. [WOJ1583]向右看齐

    题目链接: WOJ1583 题目分析: 大水题--我就来水个题解 倒序扫,单调栈维护单减序列,每个对象的答案是栈里它下面那个元素 代码: #include<bits/stdc++.h> # ...