javascript - 试图找出更简洁的方法来比较两个对象数组并为每个匹配添加属性
问题描述
我有两个单独的对象数组作为数据响应返回。我目前正在比较具有匹配 ID 的所有项目的两个数组,并从 array2 中的项目中获取属性并将它们添加到 array1 中的匹配项目。
现在我正在使用嵌套for
循环来完成此操作,但我讨厌使用嵌套循环,我正在尝试找出是否有更简洁的方法来编写它。
截至目前,这是我的功能和工作CodeSandbox:
for (var i = 0; i < arr2.length; i++) {
for (var k = 0; k < arr1.length; k++) {
if (arr2[i].id === arr1[k].id) {
arr1[k].group = arr2[i].group;
break;
}
}
}
解决方案
matchMerge(array1, array2, key)
参数:
array1
对象数组array2
对象数组key
要匹配的键的字符串
功能将:
key
从array2
with中提取给定的所有值.map()
let arr2Key = array2.map(obj2 => obj2[key]);
- 找到它的
key
值与arr2Key
值的任何匹配并获取索引或-1。
let idx = arr2Key.indexOf(obj1[key]);
- 如果
idx
大于 -1,则使用扩展运算符...
从两个数组返回合并对象,否则返回对象array1
return idx > -1 ? { ...obj1, ...array2[idx]} : obj1
注意:此函数将接受任何 2 个对象数组和任何要匹配的键/属性。它保留第一个数组的内容,只添加第二个数组的匹配对象中没有的任何内容。
const arr1=[{name:"A Quiet Place",id:"123"},{name:"Sweet Tooth",id:"456"},{name:"I Love You, Man",id:"789"}],arr2=[{group:"Horror",id:"123"},{group:"Fantasy",id:"456"},{group:"Comedy",id:"789"},{group:"Everything else",id:"001"}];
const cloner = (...arrayOfArrays) => JSON.parse(JSON.stringify(arrayOfArrays));
const matchMerge = (array1, array2, key) => {
let arr2Key = array2.map(obj2 => obj2[key]);
return array1.map(obj1 => {
let idx = arr2Key.indexOf(obj1[key]);
return idx > -1 ? { ...obj1, ...array2[idx]} : obj1
});
}
let AA = cloner(arr1, arr2);
console.log(matchMerge(AA[0], AA[1], 'id'));
console.log(arr1);
console.log(arr2);