循环实现数组filter方法
// 循环实现数组 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方法的更多相关文章
- 循环实现数组 map 方法
//循环实现数组 map 方法 const selfMap = function (fn, context) { let arr = Array.prototype.slice.call(this) ...
- ES6 必须要用的数组Filter() 方法,不要再自己循环遍历了!!!
1,来一个最简单最常用的栗子: 获得年龄为9岁的孩子 1 let arr = [ 2 { 3 name:'小明', 4 sex:0, 5 age:9 6 }, 7 { 8 name:'小红', 9 s ...
- 数组filter方法对数组元素进行过滤
Array.prototype.filter对数组中元素进行过滤 /** * @method reduce * @param {number} item 当前迭代的数组元素 * @param {num ...
- php中遍历数组的方法
参考网址:http://www.jb51.net/article/29949.htm 这三种方法中效率最高的是使用foreach语句遍历数组.从PHP4开始就引入了foreach结构,是PHP中专门为 ...
- ES6 数组遍历方法的实战用法总结(forEach,every,some,map,filter,reduce,reduceRight,indexOf,lastIndexOf)
目录 forEach every some map filter reduce && reduceRight indexOf lastIndexOf 前言 ES6原生语法中提供了非常多 ...
- 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解(转)
ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器. ...
- 学好Spark/Kafka必须要掌握的Scala技术点(一)变量、表达式、循环、Option、方法和函数,数组、映射、元组、集合
前言 Scala是以JVM为运行环境的面向对象的函数式编程语言,它可以直接访问Java类库并且与Java框架进行交互操作.正如之前所介绍,Spark是用Scala语言编写的,Kafka server端 ...
- 数组map()方法和filter()方法及字符串startsWith(anotherString)和endsWith(anotherString)方法
map方法的作用不难理解,"映射"嘛,也就是原数组被"映射"成对应新数组 var newArr = arr.map(function() {});例子: var ...
- php遍历循环数组实现方法
简单利用foreach for list each while来遍历数组,包括普通的一维数组与二维数组遍历方法,下面详细的介绍了每个函数的使用方法. $foreach = array(1,2,3); ...
随机推荐
- vue 基本知识整理
1 每个Vue.js应用都是通过构造函数Vue创建一个Vue的根实例 2 可以扩展Vue构造器,从而使用预定义选项创建可复用的组件构造器 所有的Vue.js组件其实都是被扩展的Vue实例 每一个VUE ...
- poj1308【并查集】
= =.如果输入的两个数相等.就不是一颗树啊,不能自己指向自己. 水.(瞎开的数组). //#include <bits/stdc++.h> #include<iostream> ...
- 【Unity3d】3d角色换装实现原理及步骤
http://www.cnblogs.com/dosomething/archive/2012/04/15/2450526.html 1.角色模型制作 unity3d支持Skin动画 但是不支持Ph ...
- python __builtins__ bytearray类 (7)
7.'bytearray', 返回一个新字节数组.这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256. class bytearray(object) | byte ...
- poj 1733 Parity game【hash+带权并查集】
hash一下然后用带权并查集做模2下的前缀和 #include<iostream> #include<cstdio> #include<map> #include& ...
- 【CodeForces - 651C 】Watchmen(map)
Watchmen 直接上中文 Descriptions: 钟表匠们的好基友马医生和蛋蛋现在要执行拯救表匠们的任务.在平面内一共有n个表匠,第i个表匠的位置为(xi, yi). 他们需要安排一个任务计划 ...
- 多线程 synchronized锁定当前对象
synchronized(this) 和synchronized一样,都是锁定当前对象. public class Task { synchronized public void otherMetho ...
- Jquery | 基础 | 属性过滤选择器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 线段树(单点更新) HDOJ 4288 Coder
题目传送门 #include <cstdio> #include <cstring> #define lson l, m, rt << 1 #define rson ...
- 字符串处理 Codeforces Round #305 (Div. 2) A. Mike and Fax
题目传送门 /* 字符串处理:回文串是串联的,一个一个判断 */ #include <cstdio> #include <cstring> #include <iostr ...