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

Max*_*Max 7 javascript jquery object

当且仅当目标字段存在时,javascript中是否有一种方法可以将对象中的命名字段的值分配给另一个对象的相同字段.即覆盖旧值,不添加新值,使用ideomatic构造,单行(特殊于javascript和/或jQuery)并且绝不循环,甚至for-in.

var theSource = {
 field1: "TEXT",
 field2: "VAL",
 field3: "ZZ",
 field4: "4",
 field5: "5"
},
theTarget = {
 field2: "0",
 field3: "",
 field4: null,
 field5: undefined
};
Run Code Online (Sandbox Code Playgroud)

就像是

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

不保留field1和field3之后的旧字段.

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

我们在这有哪些选择?

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

结果:

_.extend(theTarget, _(theSource).pick(_(theTarget).keys()));
Run Code Online (Sandbox Code Playgroud)

142,850 Ops/sec

Object.keys(theTarget).map(function(a) { if (a in theSource) theTarget[a] = theSource[a]; });
Run Code Online (Sandbox Code Playgroud)

403,243 Ops/sec

Dav*_*oli 7

这是单线:)

for(var propertyName in theTarget)theTarget[propertyName]&&(theTarget[propertyName]=theSource[propertyName]);
Run Code Online (Sandbox Code Playgroud)

underscore.js你一起做:

_(theTarget).extend(_(theSource).pick( _(theTarget).keys() ));
Run Code Online (Sandbox Code Playgroud)


Mat*_*ves 6

好的!单线!没有可见的循环!

Object.keys(theTarget).map(function(a){ if(theSource[a]) theTarget[a]=theSource[a]})
Run Code Online (Sandbox Code Playgroud)

虽然地图在其来源中有一个循环,但我确定。但我认为这是没有可见循环结构的唯一方法。尽管它滥用了 javascript 的全局命名空间,因此很脏。

好吧,甚至更好:

Object.keys(theTarget).map(function(a){ if(Object.keys(theSource).indexOf(a)) theTarget[a]=theSource[a]})
Run Code Online (Sandbox Code Playgroud)

更简洁

keys(theTarget).map(function(a){ if(a in theSource) theTarget[a]=theSource[a]}) 
Run Code Online (Sandbox Code Playgroud)

尽管 keys() 和 Array#indexOf 在较旧的 ecma 版本中不起作用。


elc*_*nrs 5

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

var result = {};
for (var key in theSource) {
  if (theTarget[key]) result[key] = theSource[key];
}
Run Code Online (Sandbox Code Playgroud)