在对数组进行操作中,最常遇到的操作就是遍历数组,进行相关的数据处理,最简单的做法是使用循环,for 或者 while,然而这样的写法并不算是最佳的(JAVASCRIPT WITHOUT LOOPS);在 JavaScript 中,提供了 map,reduce,reduceRight,filter,find 等方法更加灵活的实现对数组数据的操作。
本文将对 map,reduce,reduceRight,filter,find 方法的用法进行简单介绍,并各自手动对其实现。其中大部分内容都是阅读参考 MDN 文档而来。
map
map 方法创建一个新数组,其结果是该数组中的每个元素调用一个提供的回调函数。
callback: 使用三个参数currentValue,index,arraythisArg: 可选参数,指定执行callback时的this值
手动实现该方法:
📌注意
1、在上述的代码中我们注意到如下的代码:
其中 t.length >>> 0 是什么用法呢?
>>>: 无符号右移位赋值(Unsigned right shift assignment)t.length >>> 0 此处的作用是,可以将一个 non-Number 转换成 non-negative Number.
对于 var t = Object(this); 如果 this 为 null 或者 undefined,那么返回的就是一个空的对象,那么这时 t.length 获取对象的 length 属性就会返回 undefined;而 t.length >>> 0 就是为了纠正这个潜在的问题。
其实了解了为啥需要 t.length >>> 0 的原因后,我们其他可以换一种更浅显易懂的解决方式:
参考链接:
why-are-the-mdc-prototype-functions-written-this-way
what-is-the-javascript-operator-and-how-do-you-use-it
2、为对象添加方法有两种方式,此处是直接在数组的原型(Array.prototype)中添加方法;还有另一种方式:通过 Object.defineProperty 为对象定义一个方法。建议使用后者,因为直接在原型中添加方法,会有一个缺陷就是,添加的方法是可枚举的,而通过 Object.defineProperty 可以配置方法的可枚举属性。
reduce 和 reduceRight
1、reduce 方法对累加器和数组的每个值 (从左到右)应用一个函数,以将其减少为单个值。
callback: 使用四个参数accumulator,currentValue,currentIndex,arrayinitialValue: 可选参数
例子:数组求和
手动实现该方法:
2、reduceRight 方法和 reduce 类似,只不过遍历值的顺序和 reduce 方法相反,从右向左。
手动实现该方法:
filter
filter 方法使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组。
callback: 使用三个参数currentValue,index,array,返回true表示保留该值,false表示排除该值thisArg: 可选参数,指定执行callback时的this值
手动实现该方法:
find
find 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。
callback: 使用三个参数currentValue,index,arraythisArg: 可选参数,指定执行callback时的this值
手动实现该方法:
其中
void 0可参考: 关于 ‘void 0’ 和 ‘javascript:void(0)’❓