Javascript:用另一个对象中的字段只覆盖一个对象的现有字段
Javascript: Overwrite ONLY existing fields in one object with the fields in another
javascript中有办法吗将一个对象中命名字段的值分配给另一个对象的相同字段(如果且仅当目标字段存在)。也就是说,覆盖旧值,不添加新值,使用表意结构、一行代码(特别适用于javascript和/或jQuery),并且决不循环,甚至适用于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"
...
}
不保留字段1和字段3之后的旧字段。
jQuery.extend
-可以覆盖值,但也可以复制新字段。
我们有哪些选择?
http://jsbin.com/owivat/1/edit(下划线)-我喜欢这个,现在是时候找到jquery的方法了。
结果:
_.extend(theTarget, _(theSource).pick(_(theTarget).keys()));
142850操作/秒
Object.keys(theTarget).map(function(a) { if (a in theSource) theTarget[a] = theSource[a]; });
403243操作/秒
这里有一行:)
for(var propertyName in theTarget)theTarget[propertyName]&&(theTarget[propertyName]=theSource[propertyName]);
使用underscore.js
,您可以执行以下操作:
_(theTarget).extend(_(theSource).pick( _(theTarget).keys() ));
好!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版本中不起作用。
你可以手动完成,我不明白为什么"没有循环"。jQuery也以某种方式循环:
var result = {};
for (var key in theSource) {
if (theTarget[key]) result[key] = theSource[key];
}
您必须遍历source
的键,检查它们是否存在(而不是它们是否为truthy,因为这不会复制到0
、''
、false
、null
、undefined
、NaN
),并将该值复制到结果对象。因为您不想覆盖源或目标,所以不要修改它们。
jQuery.overwriteOnlyExisting = function (source, target) {
var result = {}, key;
for (key in target) {
result[key] = key in source ? source[key] : target[key];
}
return result
};
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
相关文章:
- 创建一个带有可变字段的json对象
- FilterHeader不适用于模型字段类型对象
- 如何使用Typescript创建一个包含对象的字段的新对象
- 将一个html表转换为json对象并将其发送到php页面,该表有一个输入字段
- 只有一些带undercore.js的字段在对象数组之间求交集和等于
- 如何将 JSON 字符串转换为带有 Javascript 中字段的对象
- 当字段是对象时,Elasticsearch 不会返回所有命中
- 如何对具有两个字段的对象进行排序
- 如何使用 Lodash 对 JavaScript 中特定字段的对象数组进行分组
- 如何获取具有指针字段的对象 ID 的记录
- 将数组转换为保存原始索引字段的对象
- 如何从phonegap的html5输入字段文件对象获取路径
- 按对象字段对对象数组进行排序
- lodash.没有删除具有特定字段的对象的函数
- Mongodb查询字段的对象类型
- 通过数组中的一个字段获取对象
- 如何将数组数据复制到具有数组和字段的对象
- 如何按特定字段对对象数组进行排序
- 如何检查数组是否包含 Javascript 中具有相同字段的对象
- 给一系列克隆复选框字段一个唯一名称的困难- javascript