Javascript:仅使用另一个对象中的字段覆盖一个对象中的现有字段

时间:2013-06-27 08:10:30

标签: javascript jquery object

javascript中有没有办法 当且仅当目标字段存在时,将对象中的命名字段的值分配给另一个对象的相同字段。即覆盖旧值,不添加新值,使用ideomatic构造,one-liners(特别适用于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"
... 
}

没有field1和field3之后的旧字段。

jQuery.extend - 可以覆盖值,但也可以复制新字段。

我们在这里有哪些选择?

http://jsbin.com/owivat/1/edit(下划线) - 我喜欢这个,现在是找到jquery方式的时候了。

结果:

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

142,850 Ops / sec

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

403,243 Ops / sec

5 个答案:

答案 0 :(得分:7)

这是单线:)

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

使用underscore.js即可:

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

答案 1 :(得分:5)

你可以手动完成,我不明白为什么“没有循环”。 jQuery也以某种方式循环:

var result = {};
for (var key in theSource) {
  if (theTarget[key]) result[key] = theSource[key];
}

答案 2 :(得分:3)

OK! oneliner!没有可见的循环!

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版本。

答案 3 :(得分:1)

您必须浏览source的密钥,检查它们是否存在(如果它们不是 truthy ,则不会复制0,{{1} },''falsenullundefined)并将该值复制到结果对象。由于您不想覆盖源或目标,因此请勿修改它们。

NaN

答案 4 :(得分: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