【问题标题】:JavaScript: Comparing two objectsJavaScript:比较两个对象
【发布时间】:2019-08-02 16:29:58
【问题描述】:

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

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'}
        ]

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

【问题讨论】:

  • 请添加您尝试使用过滤器的代码。

标签: javascript arrays object


【解决方案1】:

试试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)

【讨论】:

  • 我没想过用reduce...!!但我想比较两个对象并提取所有差异。例如,如果“原始”和“编辑”中的“县”也相同,我也需要删除它,而不仅仅是“名称”...
  • The final object I want is like below; 不是那样的。你能按预期更改数组吗。你的要求与预期结果不同
  • 我编辑了'原始'和'编辑'对象,请看一下
  • 您需要删除键值对的相同值。但是期望 id 对吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多