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

基于id聚合对象数组:实现同id数据存入嵌套data数组

问题分析与解决方案

原代码存在的问题

  1. forEach 无返回值,赋值给 outputArray 会得到 undefined
  2. 无论是否找到同id对象都执行 newarr.push(m),导致同一id的分组被重复添加
  3. 手动指定字段(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:55:23