在对数组进行操作中,最常遇到的操作就是遍历数组,进行相关的数据处理,最简单的做法是使用循环,for
或者 while
,然而这样的写法并不算是最佳的(JAVASCRIPT WITHOUT LOOPS);在 JavaScript 中,提供了 map
,reduce
,reduceRight
,filter
,find
等方法更加灵活的实现对数组数据的操作。
本文将对 map
,reduce
,reduceRight
,filter
,find
方法的用法进行简单介绍,并各自手动对其实现。其中大部分内容都是阅读参考 MDN 文档而来。
map
map
方法创建一个新数组,其结果是该数组中的每个元素调用一个提供的回调函数。
callback
: 使用三个参数currentValue
,index
,array
thisArg
: 可选参数,指定执行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
,array
initialValue
: 可选参数
例子:数组求和
手动实现该方法:
2、reduceRight
方法和 reduce
类似,只不过遍历值的顺序和 reduce
方法相反,从右向左。
手动实现该方法:
filter
filter
方法使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组。
callback
: 使用三个参数currentValue
,index
,array
,返回true
表示保留该值,false
表示排除该值thisArg
: 可选参数,指定执行callback
时的this
值
手动实现该方法:
find
find
方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。
callback
: 使用三个参数currentValue
,index
,array
thisArg
: 可选参数,指定执行callback
时的this
值
手动实现该方法:
其中
void 0
可参考: 关于 ‘void 0’ 和 ‘javascript:void(0)’❓