如何找到两个JavaScript对象数组之间的差异?

时间:2016-08-22 08:17:19

标签: javascript arrays javascript-objects difference data-manipulation

我有两个JavaScript数组orig(原始对象数组)和update(更新的对象的orig数组),它们具有相同的长度并包含对象,我想输出差异在每对物体之间。

示例:

var orig = [{enabled:"true", name:"Obj1", id:3},{enabled:"true", name:"Obj2", id:4}]; 

var update = [{enabled:"true", name:"Obj1", id:3}, {enabled:"true", name:"Obj2-updated", id:4}];

输出应为:name:"Obj2-updated"

我实施了一些东西,但需要优化......

for(var prop=0; prop<orig.length; prop++) {
  for(prop=0; prop<update.length; prop++) {
    if(orig[prop].enabled != update.enabled) { console.log(update.enabled) }
    if(orig[prop].name != update[prop].name) { console.log(update[prop].name) }
    if(orig[prop].id != update[prop].id) { console.log(update[prop].id) }
  }
}

5 个答案:

答案 0 :(得分:13)

您可以过滤密钥并使用更新的密钥获取结果集。

&#13;
&#13;
var orig = [{ enabled: "true", name: "Obj1", id: 3 }, { enabled: "true", name: "Obj2", id: 4 }],
    update = [{ enabled: "true", name: "Obj1", id: 3 }, { enabled: "true", name: "Obj2-updated", id: 4 }],
    difference = [];

orig.forEach(function (a, i) {
    Object.keys(a).forEach(function (k) {
        if (a[k] !== update[i][k]) {
            difference.push({ id: update[i].id, key: k, value: update[i][k], index: i });
        }
    });
});

console.log(difference);
&#13;
&#13;
&#13;

答案 1 :(得分:6)

假设两者的属性名称相同且值只是基元(没有对象,数组等):

Object.keys( orig )
      .forEach( (key) => {
        if( orig[ key ] !== update[ key ] ) {
          console.log( update[key] );
        }
      });

答案 2 :(得分:3)

使用Object.keys循环浏览您的对象。类似的东西:

var orig = {
  enabled: "true",
  name: "Obj1",
  id: 3
};

var update = {
  enabled: "true",
  name: "Obj1-updated",
  id: 3
};

var diff = {};

Object.keys(orig).forEach(function(key) {
  if (orig[key] != update[key]) {
    diff[key] = update[key];
  };
})

console.log(diff);

答案 3 :(得分:3)

您可以使用单个循环遍历原始对象的属性,并检查更新的对象以找出已修改的属性。

var orig = {
  enabled: "true",
  name: "Obj1",
  id: 3
};

var update = {
  enabled: "true",
  name: "Obj1-updated",
  id: 3
};

for (var key in orig) {
  if (orig[key] !== update[key]) {
    console.log(key + ': ' + update[key]);
  }
}

答案 4 :(得分:0)

您可以使用像lodash或Ramda这样的库来以简洁的方式完成它。在Ramda的情况下你可以这样做: R.difference(update, orig);