数组高级方法之迭代方法
ECMAScript 5 为数组定义了5 个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响this 的值。
传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响方法的返回值。以下是这5 个迭代方法的作用。
- every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
- some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
- filter():对数组中的每一项运行给定函数,返回该函数会返回true 的项组成的数组。
- forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
- map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
以上方法都不会改变原数组(除了forEach)。
every()和some()
最相似的是every()和some(),它们都用于查询数组中的项是否满足某个条件。
对every()来说,传入的函数必须对每一项都返回true,这个方法才返回true;否则,它就返回false。
该方法都不会改变原数组
var arr = [1, 2, 3, 4, 5];
everyResult = arr.every(function (item, index, array) {
// every方法:确保每个数组项目都得符合return的语句条件, 才会返回true
return item > 2;
})
console.log(everyResult);//false
对some()方法则是只要传入的函数对数组中的某一项返回true,就会返回true。
var arr = [1, 2, 3, 4, 5];
someResult = arr.some(function (item, index, array) {
// some方法:确保每个数组项目只要一个符合return的语句条件, 就会返回true
return item > 2;
})
console.log(someResult);//true
filter()
filter() 返回一个新数组,它利用指定的函数中return语句的条件,把所有符合该条件的数组项目组成一个新的数组返回。
该方法都不会改变原数组
var arr = [1, 2, 3, 4, 5];
filterResult = arr.filter(function (item, index, array) {
return item > 2;
})
console.log(filterResult);//[3, 4, 5]
map()
map() 返回一个新数组,原数组经过函数处理后的结果作为新数组返回。
该方法都不会改变原数组
var arr = [1, 2, 3, 4, 5];
mapResult = arr.map(function (item, index, array) {
return item * 2;
})
console.log(mapResult);//[2, 4, 6, 8, 10]
forEach()
forEach() 只是对数组中的每一项运行传入的函数。这个方法没有返回值,本质上与使用for 循环迭代数组一样。
该方法可以修改原数组。
var arr = [1, 2, 3, 4, 5];
arr.forEach(function (item, index, array) {
return item *= 2;
})
console.log(arr);//[1, 2, 3, 4, 5]
var arr = [1, 2, 3, 4, 5];
arr.forEach(function (item, index, array) {
return array[index] *= 2;
})
console.log(arr);//[2, 4, 6, 8, 10]
注:牢记函数传参时传入一个普通数据类型和引用类型的区别。
数组高级方法之归并方法
ECMAScript 5 还新增了两个归并数组的方法:reduce()和reduceRight()。
这两个方法都会迭代数组的所有项,最终返回一个经过函数处理后的值。其中,reduce()方法从数组的第一项开始,逐个遍历到最后。而reduceRight()则从数组的最后一项开始,向前遍历到第一项。
这两个方法都接收两个参数:一个函数和作为归并基础的初始值(可选的)。该方法不会改变原数组。
var arr = [1, 2, 3, 4, 5];
result = arr.reduce(function (prev, cur, index, array) {
return prev + cur;
})
console.log(result);//15
console.log(arr);//[1, 2, 3, 4, 5]
传给reduce()和reduceRight()的函数接收4 个参数:前一个值、当前值、项的索引和数组对象。