【问题标题】:How do you merge two javascript objects [duplicate]你如何合并两个javascript对象[重复]
【发布时间】:2018-06-25 12:16:45
【问题描述】:

我有一个这样的对象

let ob1 = {
'item_data':{
  'stack':{
    'purchase':'12345',
    'order':'22222'
   }
  }
}

还有一个像这样的对象

let ob2 = {
  'stack':{
    'purchase':'444444'
   }
 }

生成的对象应如下所示

result = {
  'item_data':{
    'stack':{
      'purchase':'444444',
      'order':'22222'
     }
   }
 }

代码位于 nodejs 应用程序中。我想知道是否有任何 javascript 库可以在服务器端 js 中执行这种合并/替换对象。

感谢您的帮助。

【问题讨论】:

  • 您是否尝试过编写代码来做到这一点?
  • 看看 Object.assign
  • 我试过这个let d = Object.assign(ob1['item_data'], ob2 );,它产生了这个结果{ stack: { purchase: '444444' } }

标签: javascript json node.js underscore.js


【解决方案1】:

这就是你想要的。

let ob1 = {
'item_data':{
  'stack':{
    'purchase':'12345',
    'order':'22222'
   }
  }
}
// and another object like this

let ob2 = {
  'stack':{
    'purchase':'444444'
   }
 }
Object.assign(ob1.item_data.stack, ob2.stack);
console.log(ob1);

【讨论】:

    【解决方案2】:

    试试这个:

    function merge(a, b) {
        for (var key in b) {
            if (exports.merge.call(b, key) && b[key]) {
                if ('object' === typeof (b[key])) {
                    if ('undefined' === typeof (a[key])) a[key] = {};
                    exports.merge(a[key], b[key]);
                } else {
                    a[key] = b[key];
                }
            }
        }
        return a;
    }
    merge(obj1, obj2);
    

    【讨论】:

    • 一行Object.assign就能搞定,为什么还要用到这么复杂的函数。
    • 找到了这个npmjs.com/package/merge 并且似乎工作正常。谢谢大家的及时回复。
    【解决方案3】:

    有很多 npm 包可以实现这一点,但其中一个非常流行的是 lodash.merge

    看一下lodash合并函数: https://lodash.com/docs/4.17.4#merge

    这个方法和 _.assign 类似,只是它递归地合并自己和 继承源对象的可枚举字符串键控属性到 目标对象。解析为未定义的源属性 如果存在目标值,则跳过。数组和普通对象 属性被递归合并。其他对象和值类型是 被赋值覆盖。源对象从左应用到 正确的。后续源会覆盖先前的属性分配 来源。

    还有一个例子:

    var object = {
      'a': [{ 'b': 2 }, { 'd': 4 }]
    };
    var other = {
      'a': [{ 'c': 3 }, { 'e': 5 }]
    };
    
    _.merge(object, other);
    // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
    

    使用lodash.merge npm 包来引入这个方法: https://www.npmjs.com/package/lodash.merge

    祝你好运!

    【讨论】:

    • 关于Object.assign 的附加说明:它只会复制顶级属性值,因此默认情况下不会执行问题中所示的“深度合并”。我们需要创建一个递归函数来迭代和Object.assign 每个属性才能使其工作。依靠lodash.merge 之类的其他代码会更方便,并且由于使用得当,因此更不容易出现极端情况错误。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多