1

假设我有一个如下目标对象:

{
  "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 来说是新手,我不确定我是否试图做太多事情。

谢谢!

4

3 回答 3

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

jsFiddle

于 2013-07-09T06:51:44.870 回答
0

我想我找到了一个很好的候选人(至少它对我有用,我们会看看我最终是否会发现一些限制):

https://github.com/nrf110/deepmerge/blob/master/index.js

感谢大家的帮助。

于 2013-07-09T06:56:31.180 回答
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/对象/创建

于 2013-07-09T06:35:44.950 回答