js 中遍历数组并不会改变原始数组的方法总共有 12 个:
1 | ES5: |
方法
forEach
1 | array.forEach(function(currentValue, index, arr), thisValue) |
关于 forEach()你要知道:
- 无法中途退出循环,只能用 return 退出本次回调,进行下一次回调。
- 它总是返回 undefined 值,即使你 return 了一个值。
1 | let a = [1, 2, , 3]; // 第三个元素是空的,不会遍历(undefined、null会遍历) |
every 检测数组所有元素是否都符合判断条件
1 | array.every(function(currentValue, index, arr), thisValue) |
方法返回值规则:
- 如果数组中检测到有一个元素不满足,则整个表达式返回 false,且剩余的元素不会再进行检测。
- 如果所有元素都满足条件,则返回 true
1 | function isBigEnough(element, index, array) { |
some 数组中的是否有满足判断条件的元素
1 | array.some(function(currentValue, index, arr), thisValue) |
方法返回值规则:
如果有一个元素满足条件,则表达式返回 true, 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回 false。
1 | function isBigEnough(element, index, array) { |
filter 过滤原始数组,返回新数组
1 | let new_array = arr.filter(function(currentValue, index, arr), thisArg) |
1 | let a = [32, 33, 16, 40]; |
map 对数组中的每个元素进行处理,返回新的数组
1 | let new_array = arr.map(function(currentValue, index, arr), thisArg) |
1 | let a = ["1", "2", "3", "4"]; |
reduce 为数组提供累加器,合并为一个值
1 | array.reduce(function(total, currentValue, currentIndex, arr), initialValue) |
回调第一次执行时:
如果 initialValue
在调用 reduce
时被提供,那么第一个 total
将等于 initialValue
,此时 currentValue
等于数组中的第一个值;
如果 initialValue
未被提供,那么 total
等于数组中的第一个值,currentValue
等于数组中的第二个值。此时如果数组为空
,那么将抛出 TypeError
。
如果数组仅有一个元素,并且没有提供 initialValue
,或提供了 initialValue
但数组为空,那么回调不会被执行,数组的唯一值将被返回。
1 | // 数组求和 |
reduceRight 从右至左累加
这个方法除了与 reduce 执行方向相反外,其他完全与其一致,请参考上述 reduce 方法介绍。
ES6:find()& findIndex() 根据条件找到数组成员
find()定义:用于找出第一个符合条件的数组成员,并返回该成员,如果没有符合条件的成员,则返回 undefined。
findIndex()定义:返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
1 | let new_array = arr.find(function(currentValue, index, arr), thisArg) |
这两个方法都可以识别 NaN
,弥补了 indexOf
的不足.
1 | // find |
keys()&values()&entries() 遍历键名、遍历键值、遍历键名+键值
1 | for (let index of ["a", "b"].keys()) { |
在 for..of 中如果遍历中途要退出,可以使用 break 退出循环。
如果不使用 for…of 循环,可以手动调用遍历器对象的 next 方法,进行遍历:
效率
js 有如下两种数据需要经常遍历
- 数组(Array)
- 对象(Object)
同时又提供了如下 8 种方法方便我们遍历元素
- for
- while(或 do~while)
- forEach
- for in
- map
- every
最终我们将分析遍历效率选出最佳遍历选手.
数组循环
1 | var array = [], |
所以最终结果
- 1、for 与 do while
- 2、forEach map some every filter (这 5 个不相上下,可认为运行速度差不多)
- 3、for in (多次运行不稳定)
对象循环
1 | var array = [], |
结果出乎意料
- 1、Object.values
- 2、Object.keys、for in
- 3、Object.getOwnPropertyNames