【问题标题】:Object.assign() keep all the unchaged values [duplicate]Object.assign() 保留所有未更改的值[重复]
【发布时间】:2019-03-23 04:00:12
【问题描述】:

我使用 Object.assign 错了吗?

我认为它会替换这些值,但实际上它会覆盖它们......

例如'PEACH'属性在赋值后会被删除。

这不奇怪吗?你会如何解决这个问题?

让我们拯救桃子

var result = Object.assign({
  'first_level': {
    'second_level': {
      'changeme': 'not changed bruh',
      'PEACH': 'PLEASE SAVE ME!'
    }
  },
  'hehe' : 'I will stay here'
}, {
  'first_level': {
    'second_level': {
      'change': 'Changed B]',
      'addme': 'Extra prop'
    }
  },
  'huh' : 'I want to join the party'
});

document.body.innerHTML = '<pre>'+JSON.stringify(result, null, 2)+'</pre>';

【问题讨论】:

  • 它只是非递归的。如果你想要一个递归赋值,你必须自己编写代码。
  • 它采用第一级属性并将其替换为第二级的值。
  • 为什么不在提问前先阅读the docs

标签: javascript object variable-assignment


【解决方案1】:

Object.assign 只进行浅合并。您可以使用lodash merge,它会递归合并对象。

【讨论】:

    【解决方案2】:

    虽然Object.assign 仅分配第一级,但您可以迭代对象的条目并分配值或为对象分配嵌套的分配值。

    function deeperAssign(a, b) {
        Object
            .entries(b)
            .forEach(([k, v]) => a[k] = v && typeof v === 'object'
                ? deeperAssign(a[k] = a[k] || {}, v)
                : v
            );
        return a;
    }
    
    var result = deeperAssign(
            { first_level: { second_level: { changeme: 'not changed bruh', PEACH: 'PLEASE SAVE ME!' } }, hehe: 'I will stay here' },
            { first_level: { second_level: { change: 'Changed B]', addme: 'Extra prop' } }, huh: 'I want to join the party' }
        );
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2019-07-15
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2021-09-17
      相关资源
      最近更新 更多