ZetCode

JavaScript reduce 方法

最后修改于 2025 年 4 月 4 日

在本文中,我们将展示如何使用 JavaScript 中的 reduce 方法转换数组。

数组规约

数组规约是将数组转换为单个值的过程。 reduce 方法对数组的每个元素执行一个 reducer 函数。 这会产生一个由元素计算得出的单个输出值。

reducer 函数接受四个参数:累加器、当前值、当前索引和源数组。 累加器累积回调的返回值。 它会记住迭代的值。

reduce 方法对于诸如求和数字、扁平化数组或分组对象之类的操作非常强大。它还可以为累加器获取一个初始值。如果省略,第一个数组元素将成为初始值。

基本 reduce 示例

以下示例演示了使用 reduce 方法对数字求和。

main.js
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, current) => {
    return accumulator + current;
}, 0);

console.log(sum);

我们对数组中的所有数字求和。 累加器从 0 (初始值) 开始。 每次迭代都会将当前数字添加到累加器。 最终结果是所有数字的总和。

$ node main.js
15

查找最大值

reduce 方法可以找到数组中的最大值。

main.js
const values = [12, 34, 21, 54, 38];
const max = values.reduce((acc, current) => {
    return Math.max(acc, current);
});

console.log(max);

我们在没有提供初始累加器值的情况下找到最大值。 第一个元素成为初始值。 每次迭代都会比较累加器和当前元素,并保留较高的值。

$ node main.js
54

扁平化数组

reduce 方法可以将嵌套数组扁平化为单个数组。

main.js
const nested = [[1, 2], [3, 4], [5, 6]];
const flat = nested.reduce((acc, current) => {
    return acc.concat(current);
}, []);

console.log(flat);

我们从一个空数组作为累加器开始。 每次迭代将当前的嵌套数组连接到累加器。 结果是一个包含所有元素的单个扁平化数组。

$ node main.js
[ 1, 2, 3, 4, 5, 6 ]

计算出现次数

reduce 方法可以计算数组中值的出现次数。

main.js
const fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
const count = fruits.reduce((acc, fruit) => {
    acc[fruit] = (acc[fruit] || 0) + 1;
    return acc;
}, {});

console.log(count);

我们从一个空对象作为累加器开始。 对于每个水果,我们增加其在累加器对象中的计数。 结果是一个对象,水果名称作为键,它们的计数作为值。

$ node main.js
{ apple: 3, banana: 2, orange: 1 }

按属性分组对象

reduce 方法可以按特定属性对对象进行分组。

main.js
const people = [
    { name: 'Alice', age: 21 },
    { name: 'Bob', age: 25 },
    { name: 'Charlie', age: 21 }
];

const grouped = people.reduce((acc, person) => {
    const key = person.age;
    if (!acc[key]) {
        acc[key] = [];
    }
    acc[key].push(person);
    return acc;
}, {});

console.log(grouped);

我们按年龄对人进行分组。 累加器是一个空对象。 对于每个人,我们检查他们的年龄是否存在作为键。 如果没有,我们用一个空数组初始化它。 然后我们将这个人推入他们的年龄组数组中。

$ node main.js
{
  '21': [ { name: 'Alice', age: 21 }, { name: 'Charlie', age: 21 } ],
  '25': [ { name: 'Bob', age: 25 } ]
}

来源

数组 reduce - 语言参考

在本文中,我们已经演示了如何使用 reduce() 方法来转换 JavaScript 中的数组。

作者

我的名字是 Jan Bodnar,我是一个充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 JS 数组函数。