Javascript 试图找出比较两个对象数组并为每个匹配添加属性的更简洁的方法

Javascript 试图找出比较两个对象数组并为每个匹配添加属性的更简洁的方法,javascript,Javascript,我有两个单独的对象数组作为数据响应返回。我目前正在比较两个数组中具有匹配ID的所有项,并从array2中的项获取属性,然后将它们添加到array1中的匹配项中 现在我正在使用嵌套的for循环来完成这个任务,但我讨厌使用嵌套循环,我正在尝试找出是否有更干净的方法来编写这个 到目前为止,这是我的职责和工作: for(变量i=0;i{ 让arr2Key=array2.map(obj2=>obj2[key]); 返回array1.map(obj1=>{ 设idx=arr2Key.indexOf(obj1

我有两个单独的对象数组作为数据响应返回。我目前正在比较两个数组中具有匹配ID的所有项,并从array2中的项获取属性,然后将它们添加到array1中的匹配项中

现在我正在使用嵌套的
for
循环来完成这个任务,但我讨厌使用嵌套循环,我正在尝试找出是否有更干净的方法来编写这个

到目前为止,这是我的职责和工作:

for(变量i=0;i
将其中一个转化为对象或地图,通过
id
索引,然后迭代另一个,
O(n)

matchMerge(array1,array2,key)

参数:

  • array1
    对象数组
  • array2
    对象数组
  • 要匹配的键的字符串
  • 职能将:

  • 使用
    .map()
  • 查找它的
    值与
    arr2Key
    值的任何匹配项,并获取索引或-1
  • 如果
    idx
    大于-1,则使用扩展运算符
    从两个数组返回合并对象,否则从
    array1
  • 注意:此函数将接受任何2个对象数组和任何要匹配的键/属性。它保留第一个数组的内容,只添加第二个数组的匹配对象中没有的内容

    const arr1=[{name:“一个安静的地方”,id:“123”},{name:“甜食”,id:“456”},{name:“我爱你,伙计”,id:“789”},{group:“恐怖”,id:“123”},{group:“幻想”,id:“456”},{group:“喜剧”,id:“789”},{group:“其他一切”,id:“001”};
    const cloner=(…arrayOfArrays)=>JSON.parse(JSON.stringify(arrayOfArrays));
    常量匹配合并=(数组1,数组2,键)=>{
    让arr2Key=array2.map(obj2=>obj2[key]);
    返回array1.map(obj1=>{
    设idx=arr2Key.indexOf(obj1[key]);
    返回idx>-1?{…obj1,…array2[idx]}:obj1
    });
    }
    设AA=cloner(arr1,arr2);
    log(matchMerge(AA[0],AA[1],'id');
    控制台日志(arr1);
    
    控制台日志(arr2)我认为最好通过返回带有浅克隆的新数组来避免对源数组进行变异。@tomgood point,添加了一个helper函数。
    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;
        }
      }
    }
    
    const objs1ById = Object.fromEntries(
      arr1.map(obj => [obj.id, obj])
    );
    for (const obj2 of arr2) {
      const obj1 = objs1ById[obj2.id];
      if (obj1) obj1.group = obj2.group;
    }
    
    let arr2Key = array2.map(obj2 => obj2[key]);
    
     let idx = arr2Key.indexOf(obj1[key]);
    
    return idx > -1 ? { ...obj1, ...array2[idx]} : obj1