两个对象的深层差异

时间:2017-03-15 08:59:00

标签: javascript lodash

如何获得两个对象的差异如下:

Origin = {name:{en:"test",ar:"yes"}}
Copy = {name:{en:"test",ar:"No"}}

结果应为"差异为name.ar="No"

1 个答案:

答案 0 :(得分:4)

它的功能对你有帮助。但是有一个很好的repos非常有用。请参阅demo页面



function getDifferenceBetweenObjects(objectA, objectB) {

  var propertyChanges = [];
  var objectGraphPath = ["this"];

  (function(a, b) {
    if (a.constructor == Array) {
      // BIG assumptions here: That both arrays are same length, that
      // the members of those arrays are _essentially_ the same, and 
      // that those array members are in the same order...
      for (var i = 0; i < a.length; i++) {
        objectGraphPath.push("[" + i.toString() + "]");
        arguments.callee(a[i], b[i]);
        objectGraphPath.pop();
      }
    } else if (a.constructor == Object || (a.constructor != Number &&
        a.constructor != String && a.constructor != Date &&
        a.constructor != RegExp && a.constructor != Function &&
        a.constructor != Boolean)) {
      // we can safely assume that the objects have the 
      // same property lists, else why compare them?
      for (var property in a) {
        objectGraphPath.push(("." + property));
        if (a[property].constructor != Function) {
          arguments.callee(a[property], b[property]);
        }
        objectGraphPath.pop();
      }
    } else if (a.constructor != Function) { // filter out functions
      if (a != b) {
        propertyChanges.push({
          "Property": objectGraphPath.join(""),
          "ObjectA": a,
          "ObjectB": b
        });
      }
    }
  })(objectA, objectB);
  return propertyChanges;
}

firstObj = {
  name: {
    en: "test",
    ar: "yes"
  }
}

secondObj = {
  name: {
    en: "test",
    ar: "No"
  }
}

console.log(getDifferenceBetweenObjects(firstObj, secondObj));
&#13;
&#13;
&#13;