如何更优处理对象数组,将同ID的name字段聚合为数组?
按ID分组合并对象数组中的名字字段
你当前用map只能提取出所有名字的一维数组,但要实现按ID分组、将对应名字合并为数组的需求,用Array.prototype.reduce()做聚合操作是更高效直接的方案,一步到位完成分组和数据重组。
实现代码
var items = [{ id: 1, name: 'john' }, { id: 1, name: 'jane' }, { id: 1, name: 'zack' }]; // 用reduce完成分组聚合 var result = Object.values(items.reduce((acc, item) => { const key = item.id; // 若当前ID未创建分组,初始化结构 if (!acc[key]) { acc[key] = { id: String(item.id), // 转为字符串匹配期望输出格式 names: [] }; } // 将当前name推入对应分组的names数组 acc[key].names.push(item.name); return acc; }, {})); console.log(result);
代码说明
reduce以空对象为初始值,用来暂存以ID为键的分组数据- 遍历每个对象时,先检查当前ID是否已存在分组:
- 不存在则创建包含目标结构的分组对象
- 存在则直接追加name到对应数组
- 最后用
Object.values()把分组对象的取值转为数组,得到你要的输出格式
如果需要调整names数组的排序(比如和你示例输出的顺序一致),可以在结果生成后添加排序逻辑:
result.forEach(group => { group.names.sort(); });
内容的提问来源于stack exchange,提问作者saneese
相关产品推荐
相关产品推荐

