43

次のようなオブジェクトを更新したいと考えています。

currentObject = {
    someValue : "value",
    myObject : {
        attribute1 : "foo",
        attribute2 : "bar"
    }
};

.. いくつかの変更を含むオブジェクト:

updateObject = {
    myObject : {
        attribute2 : "hello world"
    }
};

最後に、次のように currentObject を更新したいと思います。

currentObject.myObject.attribute2 == "hello world"

それは他のオブジェクトでも可能であるはずです..解決策として、オブジェクトを繰り返し処理し、どういうわけか名前空間を処理することを考えました。しかし、jQuery やプロトタイプなどのライブラリを使用して、その問題を簡単に解決できる方法はないのでしょうか。

4

4 に答える 4

12
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テストに正しいループを使用したりするなど、いくつかの型チェックを追加したい場合があります。

于 2012-09-21T16:23:31.880 に答える
1

簡単な実装は次のようになります。

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非オブジェクトが渡された場合、関数はエラーをスローします。

于 2012-09-21T16:45:55.767 に答える