首页 > 解决方案 > JavaScript:比较两个对象

问题描述

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

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”,则比较相同的 ids 数据,并从“edited”中获取数据,并仅获取“id”和已编辑的数据。
  3. 如果未设置“id”,则保留整个数据

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

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

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

标签: javascriptarraysobject

解决方案


尝试使用Array#reduce.

更新所有密钥对匹配

  • Array#map使用和indexOf函数验证编辑后的数组 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)


推荐阅读