JavaScript:比较两个对象

时间:2019-03-12 08:55:07

标签: javascript arrays object

我想比较两个对象以创建一个新对象。

original = [
            {id: "A1", name: "Nick", age: 20, country: 'JP', code: 'PHP'}
           ]

edited = [
          {name: "Mike", age: 30, country: 'US'},
          {id: "A1", name: "Nick", age: 25, country: 'US', code: 'PHP'}
         ]
  1. 比较两个对象(“原始”和“已编辑”)
  2. 如果设置了“ id”,则比较相同id的数据,并从“ edited”中获取数据,仅获得“ id”和已编辑的数据。
  3. 如果未设置'id',则保留整个数据

我想要的最终对象如下所示;

final = [
         {name: "Mike", age: 30, country: 'US'},
         {id: "A1", age: 25, country: 'US'}
        ]

我一直在尝试使用过滤器,但是我没有得到想要的结果...

2 个答案:

答案 0 :(得分:0)

尝试使用Array#reduce

已更新,且所有密钥对都匹配

  • 使用Array#mapindexOf函数验证原始数组中已编辑的数组id值可用
  • 如果不将整个对象推入新数组
  • 首先将原始数组重新创建为对象格式,例如{key:[value]}
  • 然后将每个键值对与reduce函数中的forEach匹配或不匹配

var original = [{id: "A1", name: "Nick", age: 20, country: 'JP'}];
var edited = [{name: "Mike", age: 30, country: 'US'},{id: "A1", name: "Nick", age: 25, country: 'US'}];

var ids_org = Object.keys(original[0]).reduce((a,b,c)=> (a[b]=original.map(a=> a[b]),a),{});

var res = edited.reduce((a, b) => {
  if (b.id) {
      Object.keys(b).forEach(i=>{
      if(ids_org[i].indexOf(b[i]) > -1 && i != 'id')
         delete b[i];
      })
     a.push(b);
  } else {
    a.push(b);
  }
  return a;
}, []);

console.log(res)

答案 1 :(得分:-1)

使用解构从对象中提取ID。 使用lodash isEqual方法进行比较,然后再将id添加回该对象。