【问题标题】:Compare two object to override values of one of them比较两个对象以覆盖其中一个对象的值
【发布时间】:2015-10-11 16:42:27
【问题描述】:

我需要比较两个相同的对象(第二个对象的一个​​属性比另一个多)。

我创建了这个 sn-p,它将对象的所有属性放入一个新对象中而不嵌套它们:

function getAllObjectProperties(source) {
  var result = {};
  function getProperties(object) {
    for (var property in object) {
      if (typeof object[property] === 'object') getProperties(object[property]); 
      else result[property] = object[property];
    }
  }
  getProperties(source);
  return result;
}

比较函数应该是这样的:

updateObjectProperties: function(source, target) {
    var temp_object = self.getAllObjectProperties(source);
    for (var property in temp_object) {
        if (target.hasOwnProperty(property)) {
            // target_property_of_target_element = temp_object[property];
        }
        else {
            // target_object gains new property (property nesting must be preserved)
        }
    }
}

我该怎么办?有可能吗?

【问题讨论】:

    标签: javascript object compare


    【解决方案1】:

    您可以合并对象。如果您只想在特定条件下合并对象,则可以添加条件运算符。

    研究这个答案: How can I merge properties of two JavaScript objects dynamically?

    代码:

      var mergeObj =  function (obj1, obj2) {
        var obj3 = {};
        for (var attrname in obj1) {
            obj3[attrname] = obj1[attrname];
        }
        for (var attrname in obj2) {
            obj3[attrname] = obj2[attrname];
        }
        return obj3;
    }
    

    JS 小提琴

    https://jsfiddle.net/chrislewispac/8fthog46/

    【讨论】:

    • 简单实用!谢谢,在我的情况下它是完美的!
    【解决方案2】:

    当您将一个对象的属性复制到另一个对象时,您可以使用一种称为深拷贝或浅拷贝的方法。在浅拷贝中,目标对象将引用源对象的属性,这意味着目标对象的更改将更改源对象。

    这里是浅拷贝的例子:

    var source = {a: 0, b: {c: 2, d: 3}},
        target = {a: 1};
    
    function union(target, source) {
        Object.keys(source).filter(function (key) {
            return !target.hasOwnProperty(key);
        }).forEach(function (key) {
            target[key] = source[key];
        });
    }
    
    union(target, source);
    
    console.log(target);
    

    要进行深层复制,您可以使用 JSON,但这仅在属性可以用 JSON 表示的情况下才有效。这是执行深拷贝的联合函数。

    function union(target, source) {
        Object.keys(source).filter(function (key) {
            return !target.hasOwnProperty(key);
        }).forEach(function (key) {
            target[key] = JSON.parse(JSON.stringify(source[key]));
        });
    }
    

    【讨论】:

    • 我尝试了该功能,但在我的具体情况下出现错误。我不太明白为什么,可惜我喜欢这种方法。在我的例子中,对象是 json 文件。
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多