attributes from another object

This question already has an answer here:

  • How can I merge properties of two JavaScript objects dynamically? 55 answers

  • 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;
    }
    

    should do the trick: update(currentObject, updateObject) . You might want to add some type checks, like Object(obj) === obj to extend only real objects with real objects, use a correct loop for arrays or hasOwnProperty tests.


    I suggest using underscore.js (or better, lo-dash) extend:

    _.extend(destination, *sources)

    Copy all of the properties in the source objects over to the destination object, and return the destination object. It's in-order, so the last source will override properties of the same name in previous arguments .

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

    A simple implementation would look like this.

    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];
    }
    

    This assumes no inherited properties should be cloned. It also does no checks for things like DOM objects, or boxed primitives.

    We need to iterate in reverse through the arguments so that the copy is done in a right to left matter.

    Then we make a separate cloneObject function to handle the recursive copying of nested objects in a manner that doesn't interfere with the right to left copying of the original object arguments.

    It also ensures that the initial target is a plain object.

    The cloneObject function will throw an error if a non-object was passed to it.

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

    上一篇: 你如何在Javascript中结合两个对象?

    下一篇: 另一个对象的属性