如何不使用内置/预定义函数按EmpID合并两个对象数组
合并两个对象数组(按EmpID匹配)
需求说明
输入两个对象数组,需按照EmpID字段将对应对象的属性合并,得到包含所有属性的新数组:
输入数组:
var arr1 = [{EmpID:'1',Name:'PB',EmpCode:'10001'},{EmpID:'2',Name:'SS',EmpCode:'10002'}]; var arr2 = [{EmpID:'1',Address:'GGN'},{EmpID:'2',Address:'SP-GGN'}];
预期输出:
[{EmpID:'1',Name:'PB',EmpCode:'10001',Address:'GGN'},{EmpID:'2',Name:'SS',EmpCode:'10002',Address:'SP-GGN'}];
尝试的代码及问题
我尝试直接拼接数组,但输出仅为两个数组元素的简单堆叠,并未合并对象属性:
function fun(){ var arr1 = [{EmpID:'1',Name:'PB',EmpCode:'10001'},{EmpID:'2',Name:'SS',EmpCode:'10002'}]; var arr2 = [{EmpID:'1',Address:'GGN'},{EmpID:'2',Address:'SP-GGN'}]; var arr3= []; for(var k=0; k < arr1.length; k++){ arr3.push(arr1[k]); } for(var k=0; k < arr2.length; k++){ arr3.push(arr2[k]); } console.log(arr3); var arr4 = [...arr1, ...arr2]; console.log(arr4); } fun();
输出结果:
[{"EmpID": "2", "Name": "SS", "EmpCode": "10002"},{EmpID: '2', Name: 'SS', EmpCode: '10002'},{EmpID: '1', Address: 'GGN'},{EmpID: '2', Address: 'SP-GGN'}]
限制条件:不能使用array.filter()、.find()、嵌套循环,仅允许自定义逻辑实现预期合并效果。
解决方案
可以先将arr2转换为以EmpID为键的映射对象,通过键直接匹配对应属性,再遍历arr1完成合并,全程仅用单层循环:
function mergeArrays(arr1, arr2) { // 将arr2转为EmpID到Address的映射表 const addressMap = {}; for (let i = 0; i < arr2.length; i++) { const item = arr2[i]; addressMap[item.EmpID] = item.Address; } // 遍历arr1,合并属性 const result = []; for (let i = 0; i < arr1.length; i++) { // 复制原对象避免修改原数组元素 const mergedItem = {...arr1[i]}; mergedItem.Address = addressMap[mergedItem.EmpID]; result.push(mergedItem); } return result; } // 测试 var arr1 = [{EmpID:'1',Name:'PB',EmpCode:'10001'},{EmpID:'2',Name:'SS',EmpCode:'10002'}]; var arr2 = [{EmpID:'1',Address:'GGN'},{EmpID:'2',Address:'SP-GGN'}]; console.log(mergeArrays(arr1, arr2));
若环境不支持扩展运算符...,可改用Object.assign复制对象:
const mergedItem = Object.assign({}, arr1[i]);
此方法输出符合预期,且未使用受限方法。
内容的提问来源于stack exchange,提问作者Pardeep Bhardwaj
相关产品推荐
相关产品推荐

