// 循环实现数组 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. 利用高德地图javascriptAPI做一个自己的地图

    最近由于项目中需要制作一个地图,用来选择活动地点,我就花了两天利用高德地图的javascriptAPI自制了一个地图的demo.在这了记录一下我学习的过程. 一.进入高德地图官网,再找到高德地图的开放 ...

  2. FTP相关内容

    FTP相关介绍 FTP 1)File Transfer Protocol ( FTP ) 是相当古老的网络协议之一,他最主要的功能就是进行 Server端与 Client 端之间的档案传送的功能.这个 ...

  3. angular源码剖析之Provider系列--CacheFactoryProvider

    CacheFactoryProvider 简介 源码里是这么描述的: Factory that constructs {@link $cacheFactory.Cache Cache} objects ...

  4. (水题)洛谷 - P1618 - 三连击(升级版)

    https://www.luogu.org/problemnew/show/P1618 枚举所有的A,最多 $A_9^3$ ,然后生成B和C(先判断是不是能够生成),判断有没有重复数字(比之前那个优雅 ...

  5. 基于FBX SDK的FBX模型解析与加载 -(三)

    http://blog.csdn.net/bugrunner/article/details/7229416 6. 加载Camera和Light 在FBX模型中除了几何数据外较为常用的信息可能就是Ca ...

  6. hdu2489 Minimal Ratio Tree dfs枚举组合情况+最小生成树

    #include <stdio.h> #include <set> #include <string.h> #include <algorithm> u ...

  7. iOS MD5 (Swift3)

    import Foundation extension Int { func hexedString() -> String { return NSString(format:"%02 ...

  8. zabbix自定义item(v3.4)

    1 添加user key agent.conf UnsafeUserParameters=1 UserParameter=mysql_if_running,sh /app/zabbix/alertsc ...

  9. Python标准库 re

    正则表达式 regular expression 用来匹配一系列符合句法规则的字符串,是一门独立的小型的语言,如果你了解类Unix系统,那么你对正则表达式就一定不陌生.正则表达式的概念最初是由Unix ...

  10. 495 Teemo Attacking 提莫攻击

    在<英雄联盟>的世界中,有一个叫“提莫”的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒 ...