【问题标题】:Javascript merge two objectsJavascript合并两个对象
【发布时间】:2015-08-11 19:20:16
【问题描述】:

我正在寻找像 PHP array_merge_recursive() 这样的 javascript function。 从我读过的内容来看,javascript中没有这样的东西,我想知道如何实现类似的东西。

问题:

我有两个objects

 var obj1 = {
  "AUDCAD": {
    "t": [1439238600, 1439238600],
    "o": [0.9646, 0.9646],
    "h": [0.9646, 0.9646],
    "l": [0.9645, 0.9645],
    "c": [0.9645, 0.9645],
    "v": [15, 15]
  },
  "AUDCHF": {
    "t": [1439238600, 1439238600],
    "o": [0.7291, 0.7291],
    "h": [0.7292, 0.7292],
    "l": [0.729, 0.729],
    "c": [0.7291, 0.7291],
    "v": [6, 6]
  }
};

var obj2 = {
  "AUDCAD": {
    "t": [111],
    "o": [111],
    "h": [111],
    "l": [111],
    "c": [111],
    "v": [111]
  },
  "AUDCHF": {
    "t": [111],
    "o": [111],
    "h": [111],
    "l": [111],
    "c": [111],
    "v": [111]
  }
};

在那些objects 中,我需要像这样创建一个新的:

   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]
      }
    }

我在做什么:

/* 
Code seen here: 
http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically
Author: Scdev
*/

function extendObjects() {

  var newObject = {};
  var overwriteValues = false;
  var overwriteObjects = false;

  for (var indexArgument = 0; indexArgument < arguments.length; indexArgument++) {

    if (typeof arguments[indexArgument] !== 'object') {

      if (arguments[indexArgument] == 'overwriteValues_True') {

        overwriteValues = true;
      } else if (arguments[indexArgument] == 'overwriteValues_False') {

        overwriteValues = false;
      } else if (arguments[indexArgument] == 'overwriteObjects_True') {

        overwriteObjects = true;
      } else if (arguments[indexArgument] == 'overwriteObjects_False') {

        overwriteObjects = false;
      }

    } else {

      extendObject(arguments[indexArgument], newObject, overwriteValues, overwriteObjects);
    }

  }

  function extendObject(object, extendedObject, overwriteValues, overwriteObjects) {

    for (var indexObject in object) {

      if (typeof object[indexObject] === 'object') {

        if (typeof extendedObject[indexObject] === "undefined" || overwriteObjects) {
          extendedObject[indexObject] = object[indexObject];
        }

        extendObject(object[indexObject], extendedObject[indexObject], overwriteValues, overwriteObjects);

      } else {

        if (typeof extendedObject[indexObject] === "undefined" || overwriteValues) {
          extendedObject[indexObject] = object[indexObject];
        }

      }

    }

    return extendedObject;

  }

  return newObject;
}


var newExtendedObject = extendObjects('overwriteValues_False', 'overwriteObjects_False', obj1, obj2);

我正在使用 nodejs,但我尝试了一些库但没有成功, 我也在这里阅读了一些类似的问题,但没有找到解决我的问题的方法。关于如何解决的任何建议? 感谢大家的宝贵时间。

时间解

array.push()暂时解决了我的问题

//Pseudo-code    
obj1[0]["AUDCAD"]["t"].push(obj2[0]["AUDCAD"]["t"]);

【问题讨论】:

  • 我向你推荐 lodash lodash.com/docs#merge
  • 您能更好地定义所需的行为吗?应该合并、覆盖、添加到列表等哪些类型?
  • @pzp 简而言之,我需要在obj1 的末尾附加valuesobj2 保持keysvalues 两者,所以结果应该看起来像@ 987654336@示例代码。

标签: javascript object merge


【解决方案1】:

此函数假定对象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 ] } }

【讨论】:

    【解决方案2】:
    Object.prototype.merge = function(obj) {
    
        if (typeof this !== 'object' 
           || obj === undefined 
           || typeof obj !== 'object')
            return;
    
        var self = this,
           arr = {},
           i;
    
        for (i in self) {
            if (typeof obj[i] !== 'undefined'
             && typeof self[i] === typeof obj[i]) {
                self[i].merge(obj[i]);
                arr[i] = true;
             }
        }
    
        for (i in obj) {
            if (!arr[i])
               self[i] = obj[i];
        }
    };
    
    Array.prototype.merge = function(obj) {
        if (typeof obj !== 'undefined'
            && !(obj instanceof Array))
            return;
    
        var self = this,
           i;
        for (i = 0; i < obj.length; i++)
           self.push(obj[i]);
    };
    

    运行

    obj1.merge(obj2);
    

    数据将附加到obj1

    【讨论】:

    • 扩展对象原型不是 imo 的方式。从数组到字符串再到布尔值,所有东西都可以使用该方法。
    • 我的意思是你可以做这样的事情。您可以定义您的特定对象并在其中包含合并方法。对于没有合并的对象将简单地忽略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    相关资源
    最近更新 更多