获取具有不同值的对象

Get object with differing values

我想从两个给定的对象 A 和 B 生成一个对象,只有 B 的值与 A 不同。我们可以假设所有字段都存在于 A 和 B 中。

示例:给定以下两个对象:

一个

{
    "firstName": "John",
    "lastName": "Doe",
    "nickname": "Johnny",
    "location": {
        "latitude": 1.0,
        "longitude": 1.0
    },
    "email": "john.doe@company.com"
}

B

{
    "firstName": "John",
    "lastName": "Doe",
    "nickname": "John-Boy",
    "location": {
        "latitude": 1.0,
        "longitude": 2.0
    },
    "email": "john.doe@company.com"
}

由于昵称和位置发生了变化,我希望结果为:

{
    "nickname": "John-Boy",
    "location": {
        "latitude": 1.0,
        "longitude": 2.0
    }
}

请注意,我想要完整的 location 对象,而不仅仅是更改后的 longitude

实现此目标的好方法是什么?

var array1 = {
    "firstName": "John",
    "lastName": "Doe",
    "nickname": "Johnny",
    "location": {
        "latitude": 1.0,
        "longitude": 1.0
    },
    "email": "john.doe@company.com"
}

var array2 = {
    "firstName": "John",
    "lastName": "Doe",
    "nickname": "John-Boy",
    "location": {
        "latitude": 1.0,
        "longitude": 2.0
    },
    "email": "john.doe@company.com"
}

var currentString;
  var resultObject = {};
 function loopOverObject(sourceObj, targetObj,innerObjName) {
  for (var key in sourceObj) {
   currentString = null;
   if (sourceObj.hasOwnProperty(key)) {
    
    if (typeof sourceObj[key] === "object") {
     loopOverObject(sourceObj[key],targetObj,key);
     break;
    }
    else {
     if (sourceObj[key] !== targetObj[key]) {
      if (innerObjName) {
       if (resultObject[innerObjName]) {
        resultObject[innerObjName][key] = sourceObj[key];
       }
       else {
        resultObject[innerObjName] = JSON.parse('{"'+key+'": '+sourceObj[key]+'}');
       }
      }
      else {
       currentString = sourceObj[key];
      }
     }
    }
    if (currentString) {
     resultObject[key]=currentString;
    }
   }
  }
  return resultObject;
 };
 var result = loopOverObject(array2,array1);
 
var resultDiv = document.getElementById("result")
resultDiv.innerHTML = JSON.stringify(result);
<div id="result"></div>

您可以通过获取差异列表并使用它们适当地构建新对象来使用 odiff 之类的差异模块:

var diff = odiff(A,B)
var result= {}
for(var n=0; n<diff.length; n++) {
  var key = diff.path[0] // the top-level key
  result[key] = B[key]
} 

然后你得到了我认为你想要的结果——也就是说,如果你只关心获取已更改的顶级字段。