首页 > 解决方案 > 试图找出更简洁的方法来比较两个对象数组并为每个匹配添加属性

问题描述

我有两个单独的对象数组作为数据响应返回。我目前正在比较具有匹配 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;
    }
  }
}

标签: javascript

解决方案


matchMerge(array1, array2, key)

参数:

  1. array1对象数组
  2. array2对象数组
  3. key要匹配的键的字符串

功能将:

  1. keyarray2with中提取给定的所有值.map()
let arr2Key = array2.map(obj2 => obj2[key]);
  1. 找到它的key值与arr2Key值的任何匹配并获取索引或-1。
 let idx = arr2Key.indexOf(obj1[key]);
  1. 如果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);


推荐阅读