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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:47:55