另一个对象的属性

这个问题在这里已经有了答案:

  • 我如何动态合并两个JavaScript对象的属性? 55个答案

  • 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测试。


    我建议使用underscore.js(或更好的,破折号)扩展:

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

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

    _.extend({name: 'moe'}, {age: 50});
    => {name: 'moe', age: 50}
    

    一个简单的实现将看起来像这样。

    function copyInto(target /*, source1, sourcen */) {
        if (!target || typeof target !== "object")
            target = {};
    
        if (arguments.length < 2)
            return target;
    
        for (var len = arguments.length - 1; len > 0; len--)
            cloneObject(arguments[len-1], arguments[len]);
    
        return target;
    }
    

    function cloneObject(target, source) {
        if (!source || !target || typeof source !== "object" || typeof target !== "object")
            throw new TypeError("Invalid argument");
    
        for (var p in source)
            if (source.hasOwnProperty(p))
                if (source[p] && typeof source[p] === "object")
                    if (target[p] && typeof target[p] === "object")
                        cloneObject(target[p], source[p]);
                    else
                        target[p] = source[p];
                else 
                    target[p] = source[p];
    }
    

    这假设不应该克隆继承的属性。 它也不检查诸如DOM对象或盒装原语之类的东西。

    我们需要通过参数进行反向迭代,以便复制按照从右到左的顺序完成。

    然后我们创建一个单独的cloneObject函数来处理嵌套对象的递归复制,其方式不会影响原始对象参数的左右复制。

    它还确保初始目标是一个普通对象。

    如果一个非对象被传递给它, cloneObject函数将会抛出一个错误。

    链接地址: http://www.djcxy.com/p/27327.html

    上一篇: attributes from another object

    下一篇: How to determine equality for two JavaScript objects?