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方法查找已存在的节点:
- 先找一级节点,不存在则创建并推入结果数组
- 基于找到的一级节点,查找二级节点,不存在则创建并推入其children数组
- 最后直接将三级节点推入对应二级节点的children数组
这样就能确保同层级同名节点只会存在一个,完全符合预期的嵌套结构。
内容的提问来源于stack exchange,提问作者sai anand
相关产品推荐
相关产品推荐

