Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:仅用一个对象中的字段覆盖另一个对象中的现有字段_Javascript_Jquery_Object - Fatal编程技术网

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

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

javascript有什么方法吗 当且仅当目标字段存在时,将对象中命名字段的值指定给另一个对象的相同字段。也就是说,覆盖旧值,不添加新值,使用表意结构、一行程序(专用于javascript和/或jQuery),并且不以任何方式循环,即使是在

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