Javascript合并两个对象

Javascript合并两个对象,javascript,object,merge,Javascript,Object,Merge,我正在寻找一个javascript函数,比如PHP array\u merge\u recursive。 据我所知,javascript中没有这样的东西,我想知道如何实现类似的东西 问题是: 我有两个目标: 在这些对象中,我需要创建一个新对象,如下所示: var obj3 = { "AUDCAD": { "t": [1439238600, 1439238600, 111], //Note that the value "111" is added from o

我正在寻找一个javascript函数,比如PHP array\u merge\u recursive。 据我所知,javascript中没有这样的东西,我想知道如何实现类似的东西

问题是:

我有两个目标:

在这些对象中,我需要创建一个新对象,如下所示:

   var obj3 =  {
      "AUDCAD": {
        "t": [1439238600, 1439238600, 111], //Note that the value "111" is added from obj2 to the end of obj1.
        "o": [0.9646, 0.9646, 111],
        "h": [0.9646, 0.9646, 111],
        "l": [0.9645, 0.9645, 111],
        "c": [0.9645, 0.9645, 111],
        "v": [15, 15, 111]
      },
      "AUDCHF": {
        "t": [1439238600, 1439238600, 111],
        "o": [0.7291, 0.7291, 111],
        "h": [0.7292, 0.7292, 111],
        "l": [0.729, 0.729, 111],
        "c": [0.7291, 0.7291, 111],
        "v": [6, 6, 111]
      }
    }
我在做什么:

数据将附加到obj1


数据将附加到obj1

此函数假定对象x中的所有关键帧和子关键帧都在对象y中,反之亦然

function merge(x, y) {
    var result = {};
    Object.keys(x).forEach(
        function (k) {
            result[k] = {};
            Object.keys(x[k]).forEach(
                function (j) {
                    if (j in y[k]) {
                        result[k][j] = x[k][j].concat(y[k][j]);
                    }
                });
        });
    return result;    
}
试运行:

merge(obj1, obj2);
=> { AUDCAD: 
   { t: [ 1439238600, 1439238600, 111 ],
     o: [ 0.9646, 0.9646, 111 ],
     h: [ 0.9646, 0.9646, 111 ],
     l: [ 0.9645, 0.9645, 111 ],
     c: [ 0.9645, 0.9645, 111 ],
     v: [ 15, 15, 111 ] },
  AUDCHF: 
   { t: [ 1439238600, 1439238600, 111 ],
     o: [ 0.7291, 0.7291, 111 ],
     h: [ 0.7292, 0.7292, 111 ],
     l: [ 0.729, 0.729, 111 ],
     c: [ 0.7291, 0.7291, 111 ],
     v: [ 6, 6, 111 ] } }

此函数假定对象x中的所有关键帧和子关键帧都位于对象y中,反之亦然

function merge(x, y) {
    var result = {};
    Object.keys(x).forEach(
        function (k) {
            result[k] = {};
            Object.keys(x[k]).forEach(
                function (j) {
                    if (j in y[k]) {
                        result[k][j] = x[k][j].concat(y[k][j]);
                    }
                });
        });
    return result;    
}
试运行:

merge(obj1, obj2);
=> { AUDCAD: 
   { t: [ 1439238600, 1439238600, 111 ],
     o: [ 0.9646, 0.9646, 111 ],
     h: [ 0.9646, 0.9646, 111 ],
     l: [ 0.9645, 0.9645, 111 ],
     c: [ 0.9645, 0.9645, 111 ],
     v: [ 15, 15, 111 ] },
  AUDCHF: 
   { t: [ 1439238600, 1439238600, 111 ],
     o: [ 0.7291, 0.7291, 111 ],
     h: [ 0.7292, 0.7292, 111 ],
     l: [ 0.729, 0.729, 111 ],
     c: [ 0.7291, 0.7291, 111 ],
     v: [ 6, 6, 111 ] } }

我向你推荐lodash你能更好地定义你想要的行为吗?什么类型应该合并、覆盖、添加到列表中等等?@pzp简单地说,我需要在obj1的末尾附加obj2的值,保留键和值,因此结果应该类似于obj3示例代码。我向您推荐lodash您能更好地定义所需的行为吗?什么类型应该合并、覆盖、添加到列表等?@pzp简单地说,我需要在obj1的末尾附加obj2的值,保留键和两者的值,因此,结果应该类似于obj3示例代码。扩展对象原型不是imo的方法。从数组到字符串再到布尔值,任何东西都可以使用该方法。我的观点是,您可以这样做。您可以定义特定对象,并在其中包含合并方法。对于没有合并的对象,将直接忽略。扩展对象原型不是imo的方法。从数组到字符串再到布尔值,所有东西都可以使用该方法。我的观点是,您可以这样做。您可以定义特定对象,并在其中包含合并方法。对于没有合并的对象,合并将直接忽略。
obj1.merge(obj2);
function merge(x, y) {
    var result = {};
    Object.keys(x).forEach(
        function (k) {
            result[k] = {};
            Object.keys(x[k]).forEach(
                function (j) {
                    if (j in y[k]) {
                        result[k][j] = x[k][j].concat(y[k][j]);
                    }
                });
        });
    return result;    
}
merge(obj1, obj2);
=> { AUDCAD: 
   { t: [ 1439238600, 1439238600, 111 ],
     o: [ 0.9646, 0.9646, 111 ],
     h: [ 0.9646, 0.9646, 111 ],
     l: [ 0.9645, 0.9645, 111 ],
     c: [ 0.9645, 0.9645, 111 ],
     v: [ 15, 15, 111 ] },
  AUDCHF: 
   { t: [ 1439238600, 1439238600, 111 ],
     o: [ 0.7291, 0.7291, 111 ],
     h: [ 0.7292, 0.7292, 111 ],
     l: [ 0.729, 0.729, 111 ],
     c: [ 0.7291, 0.7291, 111 ],
     v: [ 6, 6, 111 ] } }