如何将对象数组转换为含唯一id及同id name集合的新对象数组
JavaScript 数组按id分组合并实现
需求说明
将包含重复id的对象数组按id字段分组,最终输出id唯一的数组,每个数组项包含names属性,值为所有同id对象的name属性组成的集合。
示例输入
const items = [ {id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}, {id: 1, name: 'd'}, {id: 3, name: 'f'} ];
预期输出
const result = [ {id: 1, names: ['a', 'd']}, {id: 2, names: ['b']}, {id: 3, names: ['c', 'f']} ];
推荐实现方案
使用Array.reduce结合Object.values实现,时间复杂度为O(n),仅需遍历一次原数组,性能最优:
const result = Object.values(items.reduce((accumulator, currentItem) => { // 不存在对应id的分组时先初始化 if (!accumulator[currentItem.id]) { accumulator[currentItem.id] = { id: currentItem.id, names: [] }; } // 归集当前项的name到对应分组 accumulator[currentItem.id].names.push(currentItem.name); return accumulator; }, {}));
该实现会保留id在原数组中首次出现的先后顺序,兼容所有现代浏览器及Node.js环境
内容的提问来源于stack exchange,提问作者jslearner
相关产品推荐
相关产品推荐

