Array中的map,filter,reduce,every,some,find,findIndex等方法
首先说map,filter,reduce,every,some,他们的相同点都是需要遍历数组中的每一项,不同点就需要我们一一弄清它们各自的用法。
some和every
every表示每一项都必须通过才会返回true,some表示只要数组元素某一项满足即可
var arr = [1, 12, 32, 2, 3, 44, 120, 3, 5];
var res1 = arr.every(function(item, index){
return item > 20;
});
console.log(res1); // false
var res2 = arr.some(function(item, index){
return item > 20;
});
console.log(res2); // true
filter
调用 filter 的结果是创建一个新数组,数组的元素是通过所提供函数通过测试的所有元素
var res3 = arr.filter(function(item, index, array){
return item > 20;
});
console.log(res3); // 32,44,120
如果处理表达式是运算,将无效,返回元素组成员组成的数组
var res33 = arr.filter(function(item, index, array){
return item * 2;
});
console.log('res33', res33); // 1, 12, 32, 2, 3, 44, 120, 3, 5
这个一点可以和 map 比较一下
map
调用map 的结果也是创建一个新数组,不同的是:
1.如果给定的处理函数的表达式是逻辑判断,它返回的是布尔值组成的数组
var res4 = arr.map(function(item, index, array){
return item > 20;
});
console.log(res4); // false,false,true,false,false,true,true,false,false
2.如果给定处理函数的表达式是运算表达式,它返回的是每一项运算后的结果的数组
var res5 = arr.map(function(item, index, array){
return item * 2;
});
console.log(res5); // 2,24,64,4,6,88,240,6,10
reduce
reduce方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。回调函数有两个必须的参数:
1.accumulator,累加器累加回调的返回值; 它是上一次调用回调时返回的累积值
2.currentValue,数组中正在处理的元素。
var res6 = arr.reduce(function(accumulator, item){
return accumulator + item;
});
console.log(res6); // 222
reduce的最重要点就是利用累加器参数(accumulator)了,如果值操作第二个参数 item, 将会只处理数组最后一项,跟for循环中的i的效果一样
var arr = [1, 12, 32, 2, 3, 44, 120, 3, 5];
var res66 = arr.reduce(function(accumulator, item){
return item * 2;
});
console.log('res66', res66); // 10
上面的代码试图只操作 item ,结果只是返回了数组最后一项的处理结果:5 * 2 = 10
S6为Array增加了find(),findIndex函数。find()函数用来查找目标元素,找到就返回该元素,找不到返回undefined,而findIndex()函数也是查找目标元素,找到就返回元素的位置,找不到就返回-1。
数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。
[1, 4, -5, 10].find((n) => n < 0)
// -5
[1, 5, 10, 15].find(function(value, index, arr) {
return value > 9;
}) // 10
上面代码中,find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。
数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
}) // 2
这两个方法都可以接受第二个参数,用来绑定回调函数的this对象。
另外,这两个方法都可以发现NaN,弥补了数组的IndexOf方法的不足。
[NaN].indexOf(NaN)
// -1
[NaN].findIndex(y => Object.is(NaN, y))
// 0
上面代码中,indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Object.is方法做到。
参考文章:https://blog.csdn.net/tang15886395749/article/details/65629898