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

JavaScript数组转层级嵌套结构时重复子节点问题求助

解决二维数组转嵌套层级结构时的重复子节点问题

我有一个包含重复值的二维数组,尝试用reduce方法将其转换为指定的层级嵌套结构数组,但当前实现会生成重复的子节点(比如P1下出现两个D2节点),无法得到预期结构。相关代码与结果如下:

原始数组

var array = [ 
  ['P1', 'D3', 'Cus 092', 'B-Trade-Bag', 1], 
  ['P1', 'D2', 'Cus 092', 'B-Trade-Bag', 3],
  ['P1', 'D1', 'Cus 092', 'B-Trade-Bag', 6],
  ['P1', 'D3', 'Cus 094', 'B-Trade-Bag', 6],
  ['P2', 'D3', 'Cus 095', 'B-Trade-Bag', 3],
  ['P1', 'D2', 'Cus 094', 'B-Trade-Bag', 3],
  ['P1', 'D3', 'Cus 094', 'B-Trade-Bag', 3]]

当前实现代码

var result = array.reduce((a,c) =>{
  let obj = a.find(i => i.name == c[0])
  if(obj){ 
    if(obj['children'][0].name == c[1]){ 
        obj.children[0].children.push({'name': c[2], 'value': c[4] })
    } else {
        obj.children.push({'name':c[1], 'children': [{ 'name': c[2], 'value': c[4] }] })
    }
   }else{
    obj ={'name':c[0],'children':[{'name':c[1], 'children': [{ 'name': c[2], 'value': c[4] }] }] }
    a.push(obj);
  }
  return a
},[]);

预期结果

[{"name":"P1","children":[{"name":"D3","children":[{"name":"Cus 092","value":1},{"name":"Cus 094","value":6},{"name":"Cus 094","value":3}]},{"name":"D2","children":[{"name":"Cus 092","value":3},{"name":"Cus 094","value":3}]},{"name":"D1","children":[{"name":"Cus 092","value":6}]}]},{"name":"P2","children":[{"name":"D3","children":[{"name":"Cus 095","value":3}]}]}]

实际结果

[{"name":"P1","children":[{"name":"D3","children":[{"name":"Cus 092","value":1},{"name":"Cus 094","value":6},{"name":"Cus 094","value":3}]},{"name":"D2","children":[{"name":"Cus 092","value":3}]},{"name":"D1","children":[{"name":"Cus 092","value":6}]},{"name":"D2","children":[{"name":"Cus 094","value":3}]}]},{"name":"P2","children":[{"name":"D3","children":[{"name":"Cus 095","value":3}]}]}]

问题原因

当前代码仅检查父节点的第一个子节点是否匹配,而不是遍历所有子节点查找匹配项。当后续遇到同层级的同名节点时,会直接创建新节点推入,导致重复。

修正后的代码

var result = array.reduce((a, c) => {
  // 查找或创建一级节点(如P1、P2)
  let parentNode = a.find(item => item.name === c[0]);
  if (!parentNode) {
    parentNode = { name: c[0], children: [] };
    a.push(parentNode);
  }

  // 查找或创建二级节点(如D1、D2、D3)
  let childNode = parentNode.children.find(item => item.name === c[1]);
  if (!childNode) {
    childNode = { name: c[1], children: [] };
    parentNode.children.push(childNode);
  }

  // 添加三级节点(如Cus 092、Cus 094)
  childNode.children.push({ name: c[2], value: c[4] });

  return a;
}, []);

代码说明

每一层级都通过find方法查找已存在的节点:

  1. 先找一级节点,不存在则创建并推入结果数组
  2. 基于找到的一级节点,查找二级节点,不存在则创建并推入其children数组
  3. 最后直接将三级节点推入对应二级节点的children数组

这样就能确保同层级同名节点只会存在一个,完全符合预期的嵌套结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:31:00