Object.assign() 保留所有未更改的值[重复]

Posted

技术标签:

【中文标题】Object.assign() 保留所有未更改的值[重复]【英文标题】:Object.assign() keep all the unchaged values [duplicate] 【发布时间】: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? 【参考方案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; 

【讨论】:

以上是关于Object.assign() 保留所有未更改的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Object.assign使用的方法

javascript Javascript Object.assign Alternative。 mergeObject()方法用于从一个或多个复制所有可枚举的自有属性的值

Object.assign()

Object.assign()

Object.assign()的使用

Object.assign()方法