假设我有一个如下目标对象:
{
"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来说是新手,我不确定我是否想做太多。
谢谢!
答案 0 :(得分:0)
如果你可以定义这些对象可能比较的所有可能的属性,那么你可能只是把它变成一个类(以及javascript近似)。之后,您可以比较上面提到的原型来测试它们是否是同一类型的对象,然后您可以定义一个比较函数,它将正确地比较该类的任何两个对象。如果该类具有其他可定义类的成员,那么您可以为这些类编写比较函数,并在上层比较函数中调用它们。这类似于更传统的面向对象方法。
要创建一个完全通用的方法,提到的继承链可能是一个很好的起点。特别是Object.create()可能会有所帮助。
这是一个面向对象的javascript教程。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript 并为Object.create https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
答案 1 :(得分:0)
我能提出的最快合并如下:
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
答案 2 :(得分:0)
我认为我找到了一个好的候选人(至少它是按照我的预期为我工作,我们会看到我是否最终找到了一些限制):
https://github.com/nrf110/deepmerge/blob/master/index.js
感谢大家的帮助。