【问题标题】:Get object with differing values获取具有不同值的对象
【发布时间】:2015-07-07 04:36:02
【问题描述】:

我想从两个给定的对象 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

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

【问题讨论】:

标签: javascript object diff


【解决方案1】:

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>

【讨论】:

    【解决方案2】:

    您可以通过获取差异列表并使用它们适当地构建新对象来使用像 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]
    } 
    

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

    【讨论】:

      猜你喜欢
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多