7

ターゲットフィールドが存在する場合にのみ、オブジェクト内の名前付きフィールドの値を別のオブジェクトの同じフィールドに割り当てる方法はJavaScriptにありますか? つまり、古い値を上書きし、新しい値を追加するのではなく、観念的な構造、ワンライナー (javascript および/または jQuery に特有) を使用し、for-in であっても決してループしません。

var theSource = {
 field1: "TEXT",
 field2: "VAL",
 field3: "ZZ",
 field4: "4",
 field5: "5"
},
theTarget = {
 field2: "0",
 field3: "",
 field4: null,
 field5: undefined
};

何かのようなもの

var result = jQuery.overwriteOnlyExisting(theTarget, theSource);
result === {
 field2: "VAL"
 field3: "ZZ"
... 
}

NO field1 AND field3 の後の古いフィールドは保持されます。

jQuery.extend- 値を上書きできますが、新しいフィールドもコピーします。

ここにはどのオプションがありますか?

http://jsbin.com/owivat/1/edit (アンダースコア) - 私はこれが好きです。今度は jquery の方法を見つけます。

結果:

_.extend(theTarget, _(theSource).pick(_(theTarget).keys()));

142,850 オペレーション/秒

Object.keys(theTarget).map(function(a) { if (a in theSource) theTarget[a] = theSource[a]; });

403,243 オペレーション/秒

4

5 に答える 5

7

これがワンライナーです:)

for(var propertyName in theTarget)theTarget[propertyName]&&(theTarget[propertyName]=theSource[propertyName]);

あなたがunderscore.jsできること:

_(theTarget).extend(_(theSource).pick( _(theTarget).keys() ));
于 2013-06-27T08:32:34.253 に答える
6

わかった!一発ギャグ!目に見えるループはありません!

Object.keys(theTarget).map(function(a){ if(theSource[a]) theTarget[a]=theSource[a]})

マップにはソースにループがありますが、私は確信しています。しかし、これが目に見えるループ構造なしでそれを行う唯一の方法だと思います。ただし、javascript のグローバル名前空間を悪用しているため、汚れています。

さて、さらに良い:

Object.keys(theTarget).map(function(a){ if(Object.keys(theSource).indexOf(a)) theTarget[a]=theSource[a]})

より簡潔に

keys(theTarget).map(function(a){ if(a in theSource) theTarget[a]=theSource[a]}) 

keys() と Array#indexOf は古い ecma バージョンでは機能しません。

于 2013-06-27T08:48:51.000 に答える
1
var theSource = {
 field1: "TEXT",
 field2: "VAL",
 field3: "ZZ",
 field4: "4",
 field5: "5"
},
theTarget = {
 field2: "0",
 field3: "",
 field4: null,
 field5: undefined
};

var overrideExistingProperties = function (theTarget, theSource){
    for (var property in theSource)
        if (theSource.hasOwnProperty(property) && theTarget.hasOwnProperty(property))
            theTarget[property] = theSource[property];
};

overrideExistingProperties(theTarget, theSource);
result = theTarget; //if you don't want to clone
于 2013-06-27T09:40:07.420 に答える
1

のキーを調べてsource、それらが存在するかどうかを確認し( 、 、 、 、 をコピーしないため、それらが真実であるかどうではありません) 、その値を結果オブジェクトにコピーする必要があります。ソースまたはターゲットを上書きしたくないため、変更しないでください。0''falsenullundefinedNaN

jQuery.overwriteOnlyExisting = function (source, target) {
    var result = {}, key;
    for (key in target) {
        result[key] = key in source ? source[key] : target[key];
    }
    return result
};
于 2013-06-27T08:39:30.860 に答える