从另一个对象更新JavaScript对象属性

Luc*_*ann 30 javascript properties key object

我想更新一个看起来像这样的对象:

currentObject = {
    someValue : "value",
    myObject : {
        attribute1 : "foo",
        attribute2 : "bar"
    }
};
Run Code Online (Sandbox Code Playgroud)

..包含一些包含一些变化的对象,即:

updateObject = {
    myObject : {
        attribute2 : "hello world"
    }
};
Run Code Online (Sandbox Code Playgroud)

最后我想更新currentObject,以便:

currentObject.myObject.attribute2 == "hello world"
Run Code Online (Sandbox Code Playgroud)

这也应该适用于其他对象.作为一种解决方案,我考虑迭代对象并以某种方式处理命名空间.但我想知道是否通过使用像jQuery或原型这样的库来解决这个问题.

blu*_*llu 18

我建议使用underscore.js(或更好,低保真)扩展:

_.extend(目的地,*来源)

将源对象中的所有属性复制到目标对象,然后返回目标对象.它是有序的,因此最后一个源将覆盖先前参数中相同名称的属性.

_.extend({name: 'moe'}, {age: 50});
=> {name: 'moe', age: 50}
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,Underscore和Lodash的`extend`都会覆盖`myObject`属性,而不是简单地更新它(即它将包含_only_`attribute2`).然而,Lodash的`merge`会起作用. (5认同)

Ber*_*rgi 11

function update(obj/*, …*/) {
    for (var i=1; i<arguments.length; i++) {
        for (var prop in arguments[i]) {
            var val = arguments[i][prop];
            if (typeof val == "object") // this also applies to arrays or null!
                update(obj[prop], val);
            else
                obj[prop] = val;
        }
    }
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

应该做的诀窍:update(currentObject, updateObject).您可能希望添加一些类型检查,例如Object(obj) === obj仅使用真实对象扩展实际对象,为数组或hasOwnProperty测试使用正确的循环.