Javascript:仅用一个对象中的字段覆盖另一个对象中的现有字段
javascript有什么方法吗 当且仅当目标字段存在时,将对象中命名字段的值指定给另一个对象的相同字段。也就是说,覆盖旧值,不添加新值,使用表意结构、一行程序(专用于javascript和/或jQuery),并且不以任何方式循环,即使是在Javascript:仅用一个对象中的字段覆盖另一个对象中的现有字段,javascript,jquery,object,Javascript,Jquery,Object,javascript有什么方法吗 当且仅当目标字段存在时,将对象中命名字段的值指定给另一个对象的相同字段。也就是说,覆盖旧值,不添加新值,使用表意结构、一行程序(专用于javascript和/或jQuery),并且不以任何方式循环,即使是在 var theSource = { field1: "TEXT", field2: "VAL", field3: "ZZ", field4: "4", field5: "5" }, theTarget = { field2: "0", fiel
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"
...
}
不保留字段1和字段3之后的旧字段
jQuery.extend
-可以覆盖值,但也会复制新字段
我们有哪些选择
(下划线)-我喜欢这样,现在是找到jquery方法的时候了
结果:
_.extend(theTarget, _(theSource).pick(_(theTarget).keys()));
142850次/秒
Object.keys(theTarget).map(function(a) { if (a in theSource) theTarget[a] = theSource[a]; });
403243次/秒你可以手动操作,我不明白为什么“没有循环”。jQuery也以某种方式循环:
var result = {};
for (var key in theSource) {
if (theTarget[key]) result[key] = theSource[key];
}
这是一行:)
使用下划线.js
可以执行以下操作:
_(theTarget).extend(_(theSource).pick( _(theTarget).keys() ));
您必须检查
源
的键,检查它们是否存在(不是它们是否真实,因为它们不会复制0
,'
,false
,null
,未定义的
,NaN
)并将该值复制到结果对象。因为您不想覆盖源或目标,所以不要修改它们
jQuery.overwriteOnlyExisting = function (source, target) {
var result = {}, key;
for (key in target) {
result[key] = key in source ? source[key] : target[key];
}
return result
};
好的!一行!没有可见的循环
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版本中不起作用 为什么…而且没有任何循环,即使是in?你应该使用and。基本上,它是用于源上的in-loop和目标上的object.hasown属性。@INF3RN不知道这一点很酷,但坚持使用jQuery:)我们只能用标准的js执行:object.keys(target.map(function(a){if(the source[a])the target[a]=the source[a]}jQuery只是用于DOM操作,所以你不能用jQuery执行这些操作。。。顺便说一句,标准javascript的任务很简单……一行程序的概念是错误的:)一行程序是我们可以用map/splice/filter/regex等做的很酷的事情。谢谢你让它变得有趣。@gr9zev签出下划线,对于函数编程非常有用签出注释到OP。仍然可以“拾取”获取对象作为参数吗?如果一个人必须手动列出所有字段-这是不存在的。因此,经过测试,它可以工作,但同时使用jquery和u…这是有效的,这就是为什么我试图依赖js和jquery更复杂的机制,而不是陷入“忘了什么”的陷阱。这更好,但我看到了js的魔力,必须对“if(theSource[a])”进行某种内置检查。另外,请注意Poetro的回答,这个解决方案不能与源[a]=''、0、null等一起工作。好的,这里有一个更好的解决方案。数组#indexOf应该可以很好地工作。我不认为可以将其重构为更简洁的形式。我们将看到),但它很好,使用Object:Object.keys(target.map(函数(a){if(a在源中)target[a]=source[a];})更好;
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
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