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

如何按ID映射合并两个数组?修复代码匹配失效问题

如何正确合并两个结构不同的数组?

我有以下两个数组需要合并:

数组1(基础数据)

const arr1 = [
 {"id": 699306, "address": "On earth" },
 {"id": 701298, "address": "On earth" },
 {"id": 701299, "address": "On earth" },
 {"id": 701300, "address": "On earth" }
];

数组2(权限数据)

const arr2 = [
{
    "included": [
        {
            "id": 699306,
            "levelColumn": "CLAIM_DATE",
            "levelColumnName": "Claims",
            "isIncluded": true,
            "tabs": [{"tabId": 1231, "tabName": "Files"}],
            "levels": [
                {"permValue": "01/01/2021", "permName": "01/01/2021"},
                {"permValue": "01/01/2022", "permName": "01/01/2022"},
                {"permValue": "01/01/2023", "permName": "01/01/2023"},
                {"permValue": "01/01/2024", "permName": "01/01/2024"},
                {"permValue": "01/01/2025", "permName": "01/01/2025"},
                {"permValue": "01/02/2023", "permName": "01/02/2023"},
                {"permValue": "01/02/2024", "permName": "01/02/2024"},
                {"permValue": "01/03/2024", "permName": "01/03/2024"},
                {"permValue": "01/03/2026", "permName": "01/03/2026"},
                {"permValue": "01/04/2022", "permName": "01/04/2022"},
                {"permValue": "01/04/2023", "permName": "01/04/2023"},
                {"permValue": "01/04/2024", "permName": "01/04/2024"}
            ]
        },
        {
            "id": 701298,
            "levelColumn": "CLAIM_DATE",
            "levelColumnName": "Claims",
            "isIncluded": true,
            "tabs": [{"tabId": 1231, "tabName": "Files"}],
            "levels": [
                {"permValue": "01/01/2021", "permName": "01/01/2021"},
                {"permValue": "01/01/2022", "permName": "01/01/2022"}
            ]
        },
        {
            "id": 647298,
            "levelColumn": "SOURCE_FILE_ID",
            "levelColumnName": "Files",
            "isIncluded": true,
            "tabs": [{"tabId": 1231, "tabName": "Files"}, {"tabId": 1251, "tabName": "Files - noinv"}],
            "levels": [
                {"permValue": "2028524", "permName": "0000841354-LAMB-0303043272-11_17_2023_A_Gold.txt"},
                {"permValue": "2092815", "permName": "0000841354-LAMB-0305232305-051324_A_Gold.txt"},
                {"permValue": "2093469", "permName": "0000841354-LAMB-1135418182-051624_A_Gold.txt"},
                {"permValue": "2125382", "permName": "0000841354-LAMB-303368862-12_12_23_3020_Gold.txt"}
            ]
        },
        {
            "id": 699307,
            "levelColumn": "CLAIM_DATE",
            "levelColumnName": "Claims",
            "isIncluded": true,
            "tabs": [{"tabId": 1231, "tabName": "Files"}],
            "levels": [
                {"permValue": "01/01/2021", "permName": "01/01/2021"},
                {"permValue": "01/01/2022", "permName": "01/01/2022"},
                {"permValue": "01/01/2023", "permName": "01/01/2023"},
                {"permValue": "01/01/2024", "permName": "01/01/2024"},
                {"permValue": "01/01/2025", "permName": "01/01/2025"},
                {"permValue": "01/02/2023", "permName": "01/02/2023"},
                {"permValue": "01/02/2024", "permName": "01/02/2024"},
                {"permValue": "01/03/2024", "permName": "01/03/2024"},
                {"permValue": "01/03/2026", "permName": "01/03/2026"},
                {"permValue": "01/04/2022", "permName": "01/04/2022"},
                {"permValue": "01/04/2023", "permName": "01/04/2023"},
                {"permValue": "01/04/2024", "permName": "01/04/2024"}
            ]
        },
        {
            "id": 701298,
            "levelColumn": "MSTR_ENTERPRISE_ID",
            "levelColumnName": "Enterprise",
            "isIncluded": true,
            "tabs": [{"tabId": 1971, "tabName": "Users"}],
            "levels": [{"permValue": "23", "permName": "Aramark"}, {"permValue": "693", "permName": "Aryzta"}]
        },
        {
            "id": 693298,
            "levelColumn": "E1_APP_USER_ID",
            "levelColumnName": "User",
            "isIncluded": true,
            "tabs": [{"tabId": 1971, "tabName": "Users"}],
            "levels": [{"permValue": "137064", "permName": "   (tibersoftsmuckers [137064])"}, {"permValue": "136184", "permName": " QA (tsoceanspray [136184])"}]
        },
        {
            "id": 693298,
            "levelColumn": "E1_APP_USER_TYPE",
            "levelColumnName": "User Type",
            "isIncluded": true,
            "tabs": [{"tabId": 1971, "tabName": "Users"}],
            "levels": [{"permValue": "Client", "permName": "Client"}, {"permValue": "Not Provided", "permName": "Not Provided"}, {"permValue": "Tibersoft", "permName": "Tibersoft"}]
        }
    ],
    "excluded": [
        {
            "id": 368302,
            "levelColumn": "E1_APP_USER_ID",
            "levelColumnName": "User",
            "isIncluded": false,
            "tabs": [{"tabId": 1971, "tabName": "Users"}],
            "levels": [
                {"permValue": "575301", "permName": " Kelley Mahowald (kmahowald [575301])"},
                {"permValue": "134560", "permName": " Support (support [134560])"},
                {"permValue": "135241", "permName": " Support (support [135241])"},
                {"permValue": "138248", "permName": " Support (support [138248])"},
                {"permValue": "136725", "permName": " Tibersoftaramark (tibersoftaramark [136725])"},
                {"permValue": "137705", "permName": " Tibersoftjmfg (tibersoftjmfg [137705])"},
                {"permValue": "138508", "permName": " Tibersoftlw (tibersoftlw [138508])"},
                {"permValue": "139330", "permName": " Tibersoftschwans (tibersoftschwans [139330])"},
                {"permValue": "136726", "permName": " Tsconagra (tsaramark [136726])"},
                {"permValue": "134466", "permName": "(abailey [134466])"},
                {"permValue": "134284", "permName": "(afitzgerald [134284])"},
                {"permValue": "137484", "permName": "(c [137484])"},
                {"permValue": "31346", "permName": "(caradp [31346])"},
                {"permValue": "31658", "permName": "(caramarie [31658])"}
            ]
        }
    ]
  }
];

期望合并结果

const mergedArr = [
 {"id": 699306, "address": "On earth", "included": [items from arr2's included where id matches], "excluded": [items from arr2's excluded where id matches] },
 {"id": 701298, "address": "On earth", "included": [items from arr2's included where id matches], "excluded": [items from arr2's excluded where id matches] },
 {"id": 701299, "address": "On earth", "included": [], "excluded": [] }, // 无匹配ID
 {"id": 701300, "address": "On earth", "included": [], "excluded": [] }
];

原代码问题分析

之前的代码返回的included和excluded均为空或null,核心问题有两个:

  1. 结构理解错误:arr2是一个仅包含1个对象的数组,这个对象内部才是included和excluded数组,直接用array2.find(item => item.id === item1.id)完全找不到匹配项——因为arr2的元素本身没有id属性,id存在于included和excluded的子项中。
  2. 合并逻辑错误:即使找到匹配项,直接展开对象的方式也无法正确筛选出对应id的权限项。

修正后的实现代码

interface Item {
  id: number;
  address: string;
  included?: any[];
  excluded?: any[];
}

interface PermissionData {
  included: any[];
  excluded: any[];
}

mapArraysById(array1: Item[], array2: PermissionData[]): Item[] {
  // 取出arr2里唯一的权限数据对象,默认空数组兜底
  const permissionData = array2[0] || { included: [], excluded: [] };
  const { included, excluded } = permissionData;

  return array1.map(item1 => {
    // 筛选included中id匹配的所有项
    const matchedIncluded = included.filter(item => item.id === item1.id);
    // 筛选excluded中id匹配的所有项
    const matchedExcluded = excluded.filter(item => item.id === item1.id);

    return {
      ...item1,
      included: matchedIncluded,
      excluded: matchedExcluded
    };
  });
}

代码说明

  1. 先从arr2中提取包含included和excluded的核心对象(因为arr2是单元素数组),同时做空值兜底处理。
  2. 遍历arr1的每个元素,用filter分别筛选出权限数据中id匹配的包含项和排除项。
  3. 将原元素的属性与筛选后的权限数组合并,返回新对象。
  4. 对于没有匹配id的元素,filter会返回空数组,自动满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:29:50