You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何reduce累加器会重置?如何保留reduce函数的累加值?

为什么reduce累加器每次重置,以及解决方法

嘿,我来帮你捋清楚这个问题哈~

问题原因

你当前的reduce回调函数犯了一个关键错误:每次迭代都返回了一个全新的对象,完全没有复用之前的累加器acc。

看你的代码:

const f = a.reduce((acc, val) => { 
  console.log({ acc }) 
  return { [val]: { age: b[val].age } } 
}, {})

初始时acc是你传入的空对象{},但第一次迭代后,你返回了{1: {age:25}},把初始的空对象丢了;第二次迭代时,acc就变成了这个新对象,但你又返回了{2: {age:28}},再次丢掉之前的结果……以此类推,最后自然只剩下最后一次迭代生成的{5: {age:25}}。

两种解决方法

方法一:直接修改累加器并返回(推荐,性能更优)

直接在原有累加器acc上添加属性,然后返回修改后的acc,这样每次迭代都会保留之前的累加结果:

const a = [1, 2, 3, 4, 5];
const b = { 1: { name: 'Dan', age: 25 }, 2: { name: 'Peter', age: 28 }, 3: { name: 'Mark', age: 38 }, 4: { name: 'Larry', age: 32 }, 5: { name: 'Simon', age: 25 }, }

const f = a.reduce((acc, val) => {
  acc[val] = { age: b[val].age };
  return acc;
}, {})

console.log(f); 
// 输出:{ 1: { age: 25 }, 2: { age: 28 }, 3: { age: 38 }, 4: { age: 32 }, 5: { age: 25 } }

方法二:使用对象展开运算符生成新对象(纯函数风格)

如果你不想修改原累加器对象(符合函数式编程的纯函数原则),可以用对象展开运算符...把之前的acc和当前新属性合并,返回一个新对象:

const f = a.reduce((acc, val) => {
  return {
    ...acc,
    [val]: { age: b[val].age }
  };
}, {})

这种方式每次都会创建新对象,适合对数据不可变性有要求的场景,但数组较大时性能会略逊于第一种方法。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:10:14