如何使用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
相关产品推荐
相关产品推荐

