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

如何使用array.reduce()将数组转换为带子键的对象

用array.reduce()实现数组分组转换

你的问题出在else分支的逻辑错误——你把已存在的数组重置成了空数组,而不是往里面添加新元素。下面是修正后的代码:

let cars = [ 
{ name: 'bmw', type: 'diesel' },
{ name: 'mercedes', type: 'gas' },
{ name: 'honda', type: 'electric' },
{ name: 'bmw', type: 'gas' }
];

let output = cars.reduce((acc, item) => {
  // 若当前品牌对应的数组不存在,先初始化空数组
  if (!acc[item.name]) {
    acc[item.name] = [];
  }
  // 往数组中添加当前车型的type对象
  acc[item.name].push({ type: item.type });
  return acc;
}, {});

console.log(output);

逻辑说明:

  • reduce的核心是通过**累加器(acc)**逐步构建最终结果,初始值{}表示从空对象开始。
  • 遍历每个元素时,先检查累加器中是否已有当前品牌的属性:没有就创建空数组,有则直接使用现有数组。
  • 不管数组是刚初始化还是已存在,都用push把{type: item.type}添加到数组末尾,这样就能实现同品牌的type对象分组。

你原来代码的问题:

当遇到第二个bmw元素时,else分支执行acc[item.name] = [],直接把之前已经创建的[{type: 'diesel'}]覆盖成了空数组,所以最终bmw对应的数组是空的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:30:24