如何按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,核心问题有两个:
- 结构理解错误:arr2是一个仅包含1个对象的数组,这个对象内部才是
included和excluded数组,直接用array2.find(item => item.id === item1.id)完全找不到匹配项——因为arr2的元素本身没有id属性,id存在于included和excluded的子项中。 - 合并逻辑错误:即使找到匹配项,直接展开对象的方式也无法正确筛选出对应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 }; }); }
代码说明
- 先从arr2中提取包含
included和excluded的核心对象(因为arr2是单元素数组),同时做空值兜底处理。 - 遍历arr1的每个元素,用
filter分别筛选出权限数据中id匹配的包含项和排除项。 - 将原元素的属性与筛选后的权限数组合并,返回新对象。
- 对于没有匹配id的元素,
filter会返回空数组,自动满足需求。
内容的提问来源于stack exchange,提问作者user8512043
相关产品推荐
相关产品推荐

