基于id聚合对象数组:实现同id数据存入嵌套data数组
问题分析与解决方案
原代码存在的问题
forEach无返回值,赋值给outputArray会得到undefined- 无论是否找到同id对象都执行
newarr.push(m),导致同一id的分组被重复添加 - 手动指定字段(
code/G1等)不够灵活,新增字段时需修改代码
正确实现方法
方法一:使用Array.reduce分组(推荐,高效简洁)
const outputArray = inputArray.reduce((acc, current) => { // 解构提取id,剩余字段作为data子项 const { id, ...dataItem } = current; // 查找当前id是否已存在分组 const existingGroup = acc.find(item => item.id === id); if (existingGroup) { // 已存在则追加到data数组 existingGroup.data.push(dataItem); } else { // 不存在则新建分组并加入结果数组 acc.push({ id, data: [dataItem] }); } return acc; }, []);
方法二:修复原代码逻辑
const newarr = []; inputArray.forEach((ele) => { let m = newarr.find(e => e.id === ele.id); if (!m) { const { id, ...dataItem } = ele; m = { id, data: [dataItem] }; // 仅新建分组时才推入数组 newarr.push(m); } else { const { id, ...dataItem } = ele; // 已有分组直接追加data项 m.data.push(dataItem); } }); const outputArray = newarr;
关键优化点
- 使用对象解构
{ id, ...dataItem }自动提取除id外的所有字段,无需手动列举,扩展性更强 - 避免重复推送分组对象,仅在首次创建分组时推入结果数组
reduce方法符合函数式编程风格,逻辑更紧凑
内容的提问来源于stack exchange,提问作者Fury
相关产品推荐
相关产品推荐

