根据匹配的属性值使用另一个数组更新数组

Sra*_*ani 1 javascript arrays typescript

我有两个这样的数组

 let array1 =   [{
      'id': 1,
      'name': 'A'
    }, {
      'id': 2,
      'name': 'B'
    }, {
      'id': 3,
      'name': 'C'
    }]

let array2 =   [{
      'id': 1,
      'name': 'x'
    }, {
      'id': 2,
      'name': 'y'
    }]
Run Code Online (Sandbox Code Playgroud)

我想用基于 id 值匹配的数组 2 对象值更新数组 1。结果会是这样的。

 [{
      'id': 1,
      'name': 'x'
    }, {
      'id': 2,
      'name': 'y'
    }, {
      'id': 3,
      'name': 'C'
    }]
Run Code Online (Sandbox Code Playgroud)

我写过类似的东西但不起作用。

    array1.forEach(item1 => {
        const itemFromArr2 = array2.find(item2 => item2.id== item1.id);
        if (itemFromArr2) {
           item1= itemFromArr2;
        }
     }
  )
Run Code Online (Sandbox Code Playgroud)

请建议我如何做到这一点。

jns*_*jns 5

您可能想检查一下这一行:

array1.map(e => (e.name = array2.find(a => a.id == e.id)?.name || e.name, e));
Run Code Online (Sandbox Code Playgroud)

解释:我们正在映射array1并在array2中搜索匹配的 id ,如果找到(array2.find(a => a.id == e.id)?.name),我们覆盖名称属性(e.name = ...),否则我们保持原样(... || e.name)。

小例子:

array1.map(e => (e.name = array2.find(a => a.id == e.id)?.name || e.name, e));
Run Code Online (Sandbox Code Playgroud)

根据@Roster的评论进行编辑,如果你想覆盖整个条目,请使用这一行:

array1.map(e => (e = array2.find(a => a.id == e.id) || e, e));
Run Code Online (Sandbox Code Playgroud)

第二个例子

let array1 = [{
  'id': 1,
  'name': 'A'
}, {
  'id': 2,
  'name': 'B'
}, {
  'id': 3,
  'name': 'C'
}]

let array2 = [{
  'id': 1,
  'name': 'x'
}, {
  'id': 2,
  'name': 'y'
}]

const newarray = array1.map(e => (e.name = array2.find(a => a.id == e.id)?.name || e.name, e));
console.log(newarray);
Run Code Online (Sandbox Code Playgroud)