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

JavaScript使用reduce转换对象数组时遍历从索引1开始问题

问题原因

你遇到的问题是调用reduce方法时没有传入第二个参数初始累计值。
Array.prototype.reduce的执行规则如下:

  • 传入初始值时:第一次回调的prev参数为你传入的初始值,curr从数组索引0的第一个元素开始遍历
  • 未传入初始值时:第一次回调的prev参数自动取数组索引0的第一个元素,curr从数组索引1的第二个元素开始遍历

你的代码没有传入初始值,所以第一次迭代时prev就是{key: "a", value: 1},执行{...prev}后会把这个对象的key、value两个属性直接展开到新对象中,最终输出的结果自然不符合预期。

修复方案

不需要单独处理第一个元素,只要给reduce传入空对象{}作为初始累计值即可:

const input = [
  {key: "a", value: 1}, 
  {key: "b", value: 2}, 
  {key: "c", value: 3}, 
  {key: "d", value: 4}
];

// 写法1:直接修改累计对象,性能更高
let output = input.reduce((prev, curr) => {
  prev[curr.key] = curr;
  return prev;
}, {}); // 此处传入空对象作为初始值

// 写法2:保留你原有的展开逻辑,每次返回新对象的不可变写法
let output = input.reduce((prev, curr) => {
  let obj = {...prev};
  obj[curr.key] = curr;
  return obj;
}, {});

两种写法都可以得到你期望的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:06:04