如果发现使用其他值更新嵌套属性,则添加该属性
Updating a nested property with a different value if found, else add it
假设我有一个目标对象,如下所示:
{
"info": {
"name": "Tito",
"email": "tito@foo.com",
"company": "FOOBAR INC."
}
}
我想用以下对象修补/更新上面的目标对象:
{
"info": {
"email": "tito@foobar.com",
"company": "Foobar Inc.",
"state": "CA"
}
}
因此以以下内容结束:
{
"info": {
"name": "Tito",
"email": "tito@foobar.com",
"company": "Foobar Inc.",
"state": "CA"
}
}
如果找到,更新最简单的方法是什么?如果找不到,则添加(考虑到属性可能嵌套)。有简单的方法吗?
到目前为止,我已经尝试了以下内容,但仅适用于一级属性:
module.exports.mergeObjects = function (obj1, obj2) {
var obj3 = {};
for (var attrname1 in obj1) {
if (obj1.hasOwnProperty(attrname1)) {
obj3[attrname1] = obj1[attrname1];
}
}
for (var attrname2 in obj2) {
if (obj2.hasOwnProperty(attrname2)) {
obj3[attrname2] = obj2[attrname2];
}
}
return obj3;
};
我需要做一次深度的穿越。在Obj-C中,我会很快做到这一点,但作为JS的新手,我不确定我是否试图做得太多。
谢谢!
如果你能定义这些对象可能比较的所有可能的属性,那么你就可以把它变成一个类(好吧,javascript近似)。之后,您可以比较前面提到的原型,以测试它们是否是相同类型的对象,然后您可以定义一个比较函数,该函数将正确地比较该类的任何两个对象。如果该类具有其他可定义类的成员,则可以为这些类编写比较函数,并调用上层比较函数中的比较函数。这将类似于更传统的面向对象方法。
要创建一个完全通用的方法,前面提到的继承链可能是一个很好的起点。特别是Object.create()可能会有所帮助。
这里有一个关于面向对象javascript的教程。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript和对于Object.createhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
我能想到的最快的合并是:
var mergeObjects = function (original, merging) {
var merger = function (target, merging) {
for (var member in merging) {
if (merging.hasOwnProperty(member)) {
if (typeof merging[member] === "object") {
if (!target[member]) {
target[member] = {};
}
merger(target[member], merging[member]);
} else {
target[member] = merging[member];
}
}
}
return target;
}
return merger(merger({},original), merging);
};
我只进行了几次测试,所以一定要测试一下
调用方:
mergeObjects(obj1, obj2);
// Where obj1 is the original object
// And obj2 is the object being merged with obj1
jsFiddle
我认为我找到了一个很好的候选人(至少它像我预期的那样对我有效,我们会看看我是否最终发现了一些局限性):
https://github.com/nrf110/deepmerge/blob/master/index.js
感谢大家的帮助。
- 选中单选框时将属性添加到输入字段
- 将css属性添加到对象的集合中
- 用javascript向数组(?)中的特定属性添加值
- AngularJs,在没有隔离的情况下将指令属性添加到作用域
- 如何将enctype属性添加到FormData()对象中
- 如何将属性添加到自定义角度指令
- 如何将额外的属性添加到bootstrapTable中
- 在 Javascript 生成的列表中,如何将自定义属性添加到 标记
- 将动态属性添加到对象末尾
- 向 JSON 对象属性添加引号
- 将地理 JSON 要素属性添加到地图框弹出窗口
- 是否有脚本/代码可以一次将链接属性添加到多个链接
- 将自定义属性添加到 vuejs 组件
- 将属性添加到带有href链接但没有#的元素
- 将属性添加到数组中的所有对象
- Jquery将data-rel属性添加到所有输入字段,并移除name属性
- 将属性添加到窗元素时是否引发事件
- 将onsubmit属性添加到表单并提交
- 将属性添加到数组中的每个对象
- 如何使用jQuery向属性添加值