首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从另一个对象更新JavaScript对象-属性

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

Stack Overflow用户
提问于 2012-09-22 00:15:27
回答 2查看 41.3K关注 0票数 41

我想要更新一个对象,它可能如下所示:

代码语言:javascript
运行
复制
currentObject = {
    someValue : "value",
    myObject : {
        attribute1 : "foo",
        attribute2 : "bar"
    }
};

。。具有包含某些更改的对象,例如:

代码语言:javascript
运行
复制
updateObject = {
    myObject : {
        attribute2 : "hello world"
    }
};

最后,我想更新一下currentObject,以便:

代码语言:javascript
运行
复制
currentObject.myObject.attribute2 == "hello world"

对于其他对象,这也应该是可能的。作为一种解决方案,我考虑在对象上迭代,并以某种方式处理命名空间。但我想知道是否有一个简单的解决方案,通过使用一个库,如jQuery或prototype。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-22 00:23:32

代码语言:javascript
运行
复制
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;
}

应该做到这一点:update(currentObject, updateObject)。您可能想要添加一些类型检查,如Object(obj) === obj,以便只扩展具有真实对象的真实对象,对数组或hasOwnProperty测试使用正确的循环。

票数 11
EN

Stack Overflow用户

发布于 2016-03-16 10:08:19

下面是一个Object.keys和递归示例:

代码语言:javascript
运行
复制
// execute object update function
update(currentObject, updateObject)

// instantiate object update function
function update (targetObject, obj) {
  Object.keys(obj).forEach(function (key) {

    // delete property if set to undefined or null
    if ( undefined === obj[key] || null === obj[key] ) {
      delete targetObject[key]
    }

    // property value is object, so recurse
    else if ( 
        'object' === typeof obj[key] 
        && !Array.isArray(obj[key]) 
    ) {

      // target property not object, overwrite with empty object
      if ( 
        !('object' === typeof targetObject[key] 
        && !Array.isArray(targetObject[key])) 
      ) {
        targetObject[key] = {}
      }

      // recurse
      update(targetObject[key], obj[key])
    }

    // set target property to update property
    else {
      targetObject[key] = obj[key]
    }
  })
}

JSFiddle demo (打开控制台)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12534238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档