【问题标题】:How to compare 2 objects in JavaScript and return difference如何在 JavaScript 中比较 2 个对象并返回差异
【发布时间】:2020-04-02 10:40:52
【问题描述】:

我有 2 个对象,我想将旧对象与新对象进行比较,如果对象的值不同,则返回新对象。我尝试了多种解决方案,似乎我无法做到这一点。 这是我尝试过的

  var new_pkg ={scooter_id:"TM0060",lat:"45.747646",lng:"21.231496",alt:"99.200"};
    var old_pkg={scooter_id:"TM0060",lat:"25.747746",lng:"31.221496",alt:"100.200"};
    function difference(new_pkg, old_pkg) {
        function changes(new_pkg, old_pkg) {
            return _.transform(new_pkg, function(result, value, key) {


        if (!_.isEqual(value, old_pkg[key])) {
                result[key] = (_.isObject(value) && _.isObject(old_pkg[key])) ? changes(value, old_pkg[key]) : value;
            }
        });
    }
    return changes(new_pkg, old_pkg);
}

我要回{lat:"45.747646",lng:"21.231496",alt:"99.200"};

【问题讨论】:

标签: javascript arrays node.js json javascript-objects


【解决方案1】:

可以通过key比较对象值,如果有差异则返回差异对象:

var new_pkg ={scooter_id:"TM0060",lat:"45.747646",lng:"21.231496",alt:"99.200"};
var old_pkg={scooter_id:"TM0060",lat:"25.747746",lng:"31.221496",alt:"100.200"};

const getNew = (newObj, oldObj) => {
    if (Object.keys(oldObj).length == 0 
        && Object.keys(newObj).length > 0)
        return newObj;

    let diff = {};
    for (const key in oldObj) {
        if (newObj[key] && oldObj[key] != newObj[key] ) {
            diff[key] = newObj[key]; 
        }
    }

    if (Object.keys(diff).length > 0) 
        return diff;
    
    return oldObj;
}

console.log(getNew(new_pkg, old_pkg));

【讨论】:

  • 如果oldObj 为空怎么办?
  • 此算法不会包含在仅在 newObj 中的差异属性中。
  • @matvs 正如 Op 所说:i want to compare old with new and return the new one if values of object differs
  • @hussain.codes 感谢您的精彩捕获。我已经添加了这个案例。
  • @florinstefan8830 很高兴为您提供帮助!:)
【解决方案2】:

它们总是具有相同属性的对象吗?像模特?
如果是这样,那么您可以遍历其中一个并比较给定键的值。

  var new_pkg ={scooter_id:"TM0060",lat:"45.747646",lng:"21.231496",alt:"99.200"};
    var old_pkg={scooter_id:"TM0060",lat:"25.747746",lng:"31.221496",alt:"100.200"};

function getANewOneIfPropChanged(oldOne, newOne) {
  for(prop in oldOne) {
    if(oldOne[prop] !== newOne[prop]) {
      return newOne;
    }
  }
  return oldOne;
}

console.log(getANewOneIfPropChanged(old_pkg, new_pkg));

实际上,根据您获取新对象的规则,您始终可以使用新对象。 如果新道具中的道具与旧道具不同,则可以使用,但是如果它们相同,则使用新道具或旧道具都没关系。 (除非对对象本身的引用很重要)

【讨论】:

    【解决方案3】:

    试试这个:

    var new_pkg ={scooter_id:"TM0060",lat:"45.747646",lng:"21.231496",alt:"99.200"};
    var old_pkg ={scooter_id:"TM0060",lat:"25.747746",lng:"31.221496",alt:"100.200"};
    
    
    function compareObj(obj1, obj2) {
        // Create arrays of property names
        var obj1Props = Object.getOwnPropertyNames(obj1);
        var obj2Props = Object.getOwnPropertyNames(obj2);
    
        // If number of properties is different,
        // objects are not equivalent
        if (obj1Props.length != obj2Props.length) {
            return false;
        }
        
        for (var i of obj1Props) {
        	if (obj1[i] !== obj2[i]) {
          	return false;
          }
        }
    
        // If we made it this far, objects
        // are considered equivalent
        return true;
    }
    
    if (compareObj(old_pkg, new_pkg) === false) {
    	console.log(new_pkg);
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多