1.什么是reduce()
在JavaScript中,reduce()
是一个高阶函数,它接受一个回调函数作为参数,并使用该回调函数将一个数组或类数组对象的每个元素汇总为单个值。它的工作原理是迭代数组的每个元素,然后在每次迭代中将结果传递给下一次迭代。
reduce()
的语法如下:array.reduce(callback, initialValue)
其中,array
是要操作的数组,callback
是一个回调函数,initialValue
是可选的初始值。
回调函数callback
接受四个参数:累积值(初始值或前一次回调的结果)、当前元素、当前索引和整个数组。
代码示例:
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
console.log(sum); // 输出:15
在示例代码中,reduce()
使用初始值为0(作为第二个参数)开始,然后将数组中的每个元素加到累积值中,最后返回总和。回调函数取两个参数:accumulator
(累积值)和currentValue
(当前元素)。
2.reduce()使用场景
(1)求和或计算总量
使用reduce()
可以轻松地计算数组中的元素总和或总量。例如,可以计算一个数字数组的总和。
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.reduce((accumulator, currentValue) => {
return accumulator + currentValue;
}, 0);
console.log(sum); // 输出:15
(2)求最大值或最小值
通过在回调函数中比较当前元素和累积值,可以使用reduce()
计算数组中的最大值或最小值。
var numbers = [10, 5, 20, 2, 8];
var max = numbers.reduce( (accumulator, currentValue) => {
return Math.max(accumulator, currentValue);
});
console.log(max); // 输出:20
(3)数组去重
可以使用reduce()
方法将数组中的重复元素去重,只保留唯一的元素。
var numbers = [1, 2, 3, 3, 4, 4, 5];
var uniqueNumbers = numbers.reduce((accumulator, currentValue) => {
if (accumulator.indexOf(currentValue) === -1) {
accumulator.push(currentValue);
}
return accumulator;
}, []);
console.log(uniqueNumbers); // 输出:[1, 2, 3, 4, 5]
(4)对象数组转换为对象
可以使用reduce()
将一个对象数组转换为单个对象,其中数组中的每个对象属性将被合并到一个新对象中。
var students = [
{ name: "Alice", score: 80 },
{ name: "Bob", score: 90 },
{ name: "Charlie", score: 70 }
];
var result = students.reduce( (accumulator, currentValue) => {
accumulator[currentValue.name] = currentValue.score;
return accumulator;
}, {});
console.log(result); // 输出:{ Alice: 80, Bob: 90, Charlie: 70 }
(5)计算平均值
reduce()
可以用于计算数组中元素的平均值。
var numbers = [1, 2, 3, 4, 5];
var average = numbers.reduce( (accumulator, currentValue, index, array) => {
accumulator += currentValue;
if (index === array.length - 1) {
return accumulator / array.length;
} else {
return accumulator;
}
}, 0);
console.log(average); // 输出:3
(6)使用reduce()
函数将二维数组转换为一维数组
let twoDimensionalArray = [[1, 2], [3, 4], [5, 6]];
let oneDimensionalArray = twoDimensionalArray.reduce( (accumulator, currentValue) => {
return accumulator.concat(currentValue);
}, []);
console.log(oneDimensionalArray); // 输出:[1, 2, 3, 4, 5, 6]
这只是reduce()
方法的一些常见应用场景。
3.注意:
-
初始值的设置:可以将初始值作为
reduce()
函数的第二个参数传递。如果不传入初始值,并且数组的第一个元素是对象或数组,则reduce()
函数将使用该元素作为初始值。 -
空数组的情况:如果传入的数组为空,则不传入初始值会引发
TypeError
。