TypeScript合并数组 保留arr1全部数据及arr2中number字段唯一记录的实现
实现方法
要满足「arr1全保留、arr2仅加入arr1不存在的number记录、arr1优先级最高」的需求,最优方案是基于Map做去重校验,整体时间复杂度为O(n+m)(n为arr1长度,m为arr2长度),性能远优于嵌套循环对比的方案。
实现代码
function mergeArrays(arr1, arr2) { // 用Map存储已存在的number,键为number值,值为对应记录 const recordMap = new Map(); // 先全量加入arr1,保证arr1优先级 arr1.forEach(item => recordMap.set(item.number, item)); // 遍历arr2,仅加入number不存在的记录 arr2.forEach(item => { if (!recordMap.has(item.number)) { recordMap.set(item.number, item); } }); // 转成数组返回 return Array.from(recordMap.values()); } // 测试示例数据 let arr1 = [ { "number": "1234", "Name": "test", "data": [ { "qty": 0, "val": 1.11 }, { "qty": 500, "val": 2.92 }, { "qty": 1000, "val": 2.84 }, { "qty": 1500, "val": 2.66 } ] }, { "number": "6776", "Name": "test9", "data": [ { "qty": 0, "val": 2 }, { "qty": 100, "val": 3 }, { "qty": 200, "val": 4 }, { "qty": 300, "val": 5 } ] } ] let arr2 = [ { "number": "1234", "Name": "test", "data": [ { "qty": 0, "val": 1.11 } ] }, { "number": "7896", "Name": "test4", "data": [ { "qty": 0, "val": 5.11 }, { "qty": 500, "val": 6.92 }, { "qty": 1000, "val": 3.84 }, { "qty": 1500, "val": 1.66 } ] }, { "number": "4567", "Name": "test2", "data": [ { "qty": 0, "val": 4.11 }, { "qty": 500, "val": 9.92 }, { "qty": 1000, "val": 5.84 }, { "qty": 1500, "val": 7.66 } ] } ] console.log(mergeArrays(arr1, arr2))
方案优势
- 性能最优:哈希表的查找、插入操作都是O(1)时间复杂度,整体为线性遍历的时间消耗,数据量越大性能优势越明显
- 逻辑清晰:先全量保留优先级高的arr1,再补充arr2的增量数据,完全符合需求规则
- 兼容性好:Map是ES6标准特性,所有现代浏览器、Node.js环境都支持,不需要额外依赖
内容的提问来源于stack exchange,提问作者user2427573
相关产品推荐
相关产品推荐

