前言
在实际js开发中对数组操作频率非常高,看过一些小伙伴的一些用法,挺有意思,在这里小记(不全)一下,备忘。
5个迭代方法:every、filter、forEach、map和some
every()
:对数组中的每一项运行给定函数,如果该函数每一项都返回true
,则返回true
;filter()
:对数组中的每一项运行给定函数,返回该函数会返回true
的项组成的数组;forEach()
:对数组中的每一项运行给定函数,这个方法没有返回值;map()
:对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组;some()
:对数组中的每一项运行给定函数,如果该函数任意一项返回true
,则返回true
;
1 | // every |
一个归并方法:reduce
array.reduce(callback[, initialValue])
第一个参数是每一项上调用的函数,该函数有四个参数:
accumulator
:累加回调返回值;他是上一次调用时返回的累积值,或initValue
;currentValue
:数组中正在处理的元素;currentIndex
:数组中正在处理的当前元素的索引。如果提供了initialValue
,这索引号为0,否则索引为1;array
:调用reduce()
的数组。
当第二个参数省略时,遍历从数组第二项开始,数组第一项被当作前一个值accumulator
。
数组求和
1 | const numbers = [10, 20, 30, 40]; |
结果为:
1 | acc: 10; cur: 20; |
这第二个参数就是设置accumulator
的初始类型和初始值,比如为0,就表示accumulator
的初始值为Number
类型,值为0,因此,reduce
的最终结果也会是Number
类型。
1 | const numbers = [10, 20, 30, 40]; |
结果为:
1 | acc: 0; cur: 10; |
强大的reduce
reduce
作为归并方法,在有些情形可以替代其它数组操作方法,强大之处,还得要落实在具体的案例上。
假设现在有一个数列[10, 20, 30, 40, 50],每一项乘以2,然后筛选出大于60的项。
在这里更新数组每一项(map
的功能)然后筛选出一部分(filter
的功能),如果是先使用map
然后filter
的话,你需要遍历这个数组两次。在这里用reduce
更高效。
1 | var numbers = [10, 20, 30, 40, 50]; |
从这个例子可以看出reduce
完成了map
和filter
的使命。
统计数组中重复出现项的个数,用对象表示。
1 | var letters = ['A', 'B', 'C', 'C', 'B', 'C', 'C']; |
数组去重
1 | var letters = ['A', 'B', 'C', 'C', 'B', 'C', 'C']; |
ps:了解更多数组去重方法,点这里。
与ES6的结合
与ES6结合使用也会擦出不少火花。
删除目标对象某个属性。
1 | const person = { |
更简洁的方案,利用ES6中函数参数解构:
1 | const personUnknowAge = (({name, gender}) => ({name, gender}))(person); |
当然还有更简单的方案,利用ES6中对象解构:
1 | const person = { |
结尾
数组操作的“妙用”远不止这些,后面有空再研究补充吧,完~