Array.forEach()
forEach() 方法为每个数组元素调用一次函数(回调函数
)。
var txt = "";
var numbers = [45, 4, 9, 16, 25];
numbers.forEach(myFunction);function myFunction(value, index, array) {txt = txt + value + "<br>";
}
该函数接受 3 个参数:
- 项目值
- 项目索引
- 数组本身
上面的例子只用了 value 参数。这个例子可以重新写为:
var txt = "";
var numbers = [45, 4, 9, 16, 25];
numbers.forEach(myFunction);function myFunction(value) {txt = txt + value + "<br>";
}
Array.map()
map() 方法通过对每个数组元素执行函数来创建新数组。
map() 方法不会对没有值的数组元素执行函数。
map() 方法不会更改原始数组。
这个例子将每个数组值乘以2:
var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);function myFunction(value, index, array) {return value * 2;
}
请注意,该函数有 3 个参数:
- 项目值
- 项目索引
- 数组本身
当回调函数仅使用 value 参数时,可以省略索引和数组参数:
var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);function myFunction(value) {return value * 2;}
Array.filter()
filter() 方法创建一个包含通过测试的数组元素的新数组。
这个例子用值大于 18 的元素创建一个新数组
:
var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction);function myFunction(value, index, array) {return value > 18;
}
请注意此函数接受 3 个参数:
- 项目值
- 项目索引
- 数组本身
在上面的例子中,回调函数不使用 index 和 array 参数,因此可以省略它们:
var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction);function myFunction(value) {return value > 18;
}
Array.reduce()
reduce() 方法在每个数组元素上运行函数,以生成(减少它)单个值。
reduce() 方法在数组中从左到右工作。另请参阅 reduceRight()。
reduce() 方法不会减少原始数组。
这个例子确定数组中所有数字的总和:
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction);function myFunction(total, value, index, array) {return total + value;
}
请注意此函数接受 4 个参数:
总数(初始值/先前返回的值)
- 项目值
- 项目索引
- 数组本身
上例并未使用 index 和 array 参数。可以将它改写为:
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction);function myFunction(total, value) {return total + value;
}
reduce() 方法能够接受一个初始值:
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction, 100);function myFunction(total, value) {return total + value;
}
在 Array.prototype.reduce() 方法中,total 是一个约定俗成的参数名,代表累加器(accumulator)。它是回调函数的第一个参数,用于累积从数组中处理过的每个元素最终得到的单个值。
total 的初始值可以由 reduce() 函数的第二个可选参数 initialValue 提供。如果调用 reduce() 时提供了这个初始值,那么 total 的首次值就会是这个 initialValue,并且迭代将从数组的第一个元素开始。如下所示:
const numbers = [1, 2, 3, 4, 5];
const sumWithInitialValue = numbers.reduce((acc, currentValue) => acc + currentValue, 10); // 初始值为 10
console.log(sumWithInitialValue); // 输出 25(10 + 1 + 2 + 3 + 4 + 5)
如果没有提供 initialValue,则 acc 的初始值会默认为数组的第一个元素,而迭代会从数组的第二个元素开始。以下是不提供初始值的情况:
const numbers = [1, 2, 3, 4, 5];
const sumWithoutInitialValue = numbers.reduce((acc, currentValue) => acc + currentValue);
console.log(sumWithoutInitialValue);
// 输出 15(1 + 2 + 3 + 4 + 5),迭代从2开始
没有初始值时,如果数组只有一个元素,那么该元素将被直接返回,而不会执行回调函数:
const numbers = [10];
const sumSingleElement = numbers.reduce((acc, currentValue) => acc + currentValue);
console.log(sumSingleElement); // 输出 10
总之,累加器 acc 是 reduce() 中用于累积结果的变量,你可以根据需要给其提供初始值,或者使用数组的第一个元素作为默认初始值。