如何用JavaScript将数组按关联ID合并为含子数组的层级结构?
解决数组按ID分组合并的问题
没问题,我来帮你搞定这个数组合并的需求!你想要把array2里的分支数据,按照branch_group_id匹配array1的group_id,合并到对应组的child_array里对吧?之前用array_push和concat没成功,应该是没找准分组匹配的逻辑,我给你几种可行的实现方式:
基础实现方式(直观易懂)
先给array1里的每个组初始化一个空的child_array,然后遍历array2的每一项,找到对应的组后把项加进去:
// 你的原始数组 var array1 = [{group_name: "Gp HQ, Hyderabad", group_id: "1"}, {group_name: "Gp HQ, Secunderabad", group_id: "2"}, {group_name: "Group HQ, Guntur", group_id: "3"}]; var array2 = [ {unit_total: 1, branch_name: "1 (T) Air Sqn", branch_group_id: "1", branch_id: "6"}, {unit_total: 1, branch_name: "1 (T) Arty Bty", branch_group_id: "1", branch_id: "5"}, {unit_total: 3, branch_name: "1 (T) Bn", branch_group_id: "1", branch_id: "1"}, {unit_total: 1, branch_name: "1 (T) R&V Regt", branch_group_id: "1", branch_id: "4"}, {unit_total: 3, branch_name: "3 (T) Bn", branch_group_id: "1", branch_id: "2"}]; // 1. 给每个组初始化空的child_array array1.forEach(group => { group.child_array = []; }); // 2. 遍历array2,把匹配的分支项加入对应组的child_array array2.forEach(branch => { const matchedGroup = array1.find(group => group.group_id === branch.branch_group_id); if (matchedGroup) { // 确保找到匹配的组再添加 matchedGroup.child_array.push(branch); } }); // 此时array1就是你要的结果数组 console.log(array1);
不修改原数组的版本
如果你不想改动原始的array1,可以先复制一份组数据再操作:
// 创建array1的副本并初始化child_array const result_array = array1.map(group => ({ ...group, // 复制原组的所有属性 child_array: [] })); // 同样遍历array2填充数据 array2.forEach(branch => { const matchedGroup = result_array.find(group => group.group_id === branch.branch_group_id); if (matchedGroup) { matchedGroup.child_array.push(branch); } }); console.log(result_array);
性能优化版本(适合大数据量)
如果你的数组数据量比较大,每次用find遍历查找组会有点慢,可以先用Map把组按group_id存起来,查找效率会更高:
// 用Map存储组,key是group_id,value是带child_array的组对象 const groupMap = new Map(); array1.forEach(group => { groupMap.set(group.group_id, { ...group, child_array: [] }); }); // 遍历array2填充对应组的child_array array2.forEach(branch => { const targetGroup = groupMap.get(branch.branch_group_id); if (targetGroup) { targetGroup.child_array.push(branch); } }); // 把Map里的值转成数组就是最终结果 const result_array = Array.from(groupMap.values());
为什么之前的方法没成功?
concat方法是返回一个新数组,不会修改原数组,而且它只是简单拼接数组元素,没办法帮你按ID分组;直接用push的话,如果没先找到对应组就push,会把所有分支都加到同一个地方,自然达不到按组分类的效果。
内容的提问来源于stack exchange,提问作者user3668438
相关产品推荐
相关产品推荐

