获取具有不同值的对象
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]
}
然后你得到了我认为你想要的结果——也就是说,如果你只关心获取已更改的顶级字段。
我想从两个给定的对象 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]
}
然后你得到了我认为你想要的结果——也就是说,如果你只关心获取已更改的顶级字段。