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

JavaScript按id归并对象时name字段嵌套如何转为一维数组或逗号分隔串

问题修复方案

问题原因

  • 你的现有代码仅处理了name字段为字符串的合并场景,当同id的第三条及以后数据进入合并逻辑时,name已经是数组类型,原有判断条件不生效,导致出现多层嵌套数组的问题。

最小改动方案(基于你的现有代码修改)

你只需要修改合并name的逻辑分支即可:

var newData = [];
baseData.forEach(function(item, index) {
  if (newData.length === 0) {
    newData.push(item);
  } else {
    var dIndex = -1;
    newData.forEach(function(itm, idx) {
      if (item.id === itm.id) dIndex = idx;
    });
    
    if (dIndex !== -1) {
      var oldname = newData[dIndex].name;
      // 👇 修改这里的逻辑
      if (typeof oldname === 'string') {
        // 首次合并:字符串转数组
        newData[dIndex].name = [oldname, item.name];
      } else if (Array.isArray(oldname)) {
        // 非首次合并:直接追加值到数组末尾
        oldname.push(item.name);
      }
    } else {
      newData.push(item);
    }
  }
});

更高效的优化方案(时间复杂度O(n))

如果数据量较大,建议用对象作为id映射索引,避免每次遍历结果数组查找id:

const idMap = {};
baseData.forEach(item => {
  if (!idMap[item.id]) {
    // 首次遇到该id,初始化数据并把name转为数组
    idMap[item.id] = {...item, name: [item.name]};
  } else {
    // 已存在的id直接追加name值
    idMap[item.id].name.push(item.name);
  }
});
// 转换为最终数组格式
const newData = Object.values(idMap);

如果需要把name转为逗号分隔的字符串,在上述代码最后补充一行即可:

newData.forEach(item => item.name = item.name.join(','));

内容的提问来源于stack exchange,提问作者pee2pee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:57:03