Object.assign()合并对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Object.assign()合并对象相关的知识,希望对你有一定的参考价值。

参考技术A Object.assign()是es6中新增的合并对象的方法,该方法接受一个目标对象和一个或者多个源对象作为参数,然后将每个源对象中可枚举( Objetc.propertyIsEnumerable() 返回true)和自有( Object.hasOwnproperty() 返回true)属性复制到目标对象。
案例1:简单复制

案例2:多个源对象

案例3.获取函数与设置函数

Object.assign() 实际上对每个源对象执行的是浅复制,如果多个源对象都有相同的属性,则使用最后一个复制的值,但是要注意:不能在两个对象之间转移获取函数和设置函数。
案例4: Object.assign会覆盖重复的属性

案例5:对象引用
浅复制意味着只会复制对象的引用

案例6:错误处理

原文参考:
javascript高级程序设计 第四版 ,在这里写这些笔记只是为了方便自己回过头来复习

合并对象与 Object.assign 覆盖内部对象而不合并 [重复]

【中文标题】合并对象与 Object.assign 覆盖内部对象而不合并 [重复]【英文标题】:Merge object with Object.assign override internal object without merge [duplicate] 【发布时间】:2017-09-22 17:01:39 【问题描述】:

我有两个对象要合并到一个新对象中,第一个对象是谷歌图表的默认选项:

optionsA = 
    height: 500,
    focusTarget: 'category',
    hAxis: 
      showTextEvery: 0,
      slantedText: true,
      slantedTextAngle: 45,
      format: 'date',
    ,

对于我的第二个对象,我想向hAxis 添加一些属性并用新值覆盖当前选项,但我想在 optionsA 中默认保留这些选项。

这是我的第二个对象:

optionsA = 
    isStacked: true,
    hAxis: 
      gridlines: 
        count: 10
      ,
      format: 'percent',
    ,

这些对象更复杂,但我减少了属性以简化问题

当我尝试与 object.assign 合并时,结果是对象 B 向新对象添加了新的根属性,但 hAxis 中的属性完全被 optionsB 中的选项覆盖。

let newObj = Object.assign(, optionsA, optionsB);

这是我想要的对象:


    height: 500,
    focusTarget: 'category',    
    isStacked: true,
    hAxis: 
      gridlines: 
         count: 10
      ,
      format: 'percent',
      showTextEvery: 0,
      slantedText: true,
      slantedTextAngle: 45,
    ,

但我得到的不是这个:


    height: 500,
    focusTarget: 'category',    
    isStacked: true,
    hAxis: 
       gridlines: 
         count: 10
       ,
       format: 'percent',
    ,

hAxis 中的属性完全被新属性覆盖,我的方法有什么问题?

【问题讨论】:

Object.assign() 仅对源对象的***属性进行操作。它不会“下降”到子对象中。 参考这个-***.com/questions/27936772/… Object.assign(, optionsA, optionsB, hAxis: Object.assign(, optionsA.hAxis, optionsB.hAxis)) 应该这样做 【参考方案1】:

如果嵌套不深,您可以分两步打破合并过程,如下所示:

optionsA = 
    height: 500,
    focusTarget: 'category',
    hAxis: 
      showTextEvery: 0,
      slantedText: true,
      slantedTextAngle: 45,
      format: 'date',
    
;

optionsB = 
    isStacked: true,
    hAxis: 
      gridlines: 
        count: 10
      ,
      format: 'percent',
    
;

let newNestedMerged = Object.assign(,optionsA.hAxis, optionsB.hAxis);
optionsA.hAxis = newNestedMerged;
optionsB.hAxis = newNestedMerged;
let newObj =  Object.assign(optionsA, optionsB);
console.log(newObj);

这有帮助吗?

【讨论】:

【参考方案2】:

因为您在两个对象中具有相同的属性。

属性被具有相同属性的其他对象覆盖 参数顺序后面的属性。

让我们看看MDN中assign的例子。

我的建议是先合并相同的属性。

optionsA = 
    height: 500,
    focusTarget: 'category',
    hAxis: 
      showTextEvery: 0,
      slantedText: true,
      slantedTextAngle: 45,
      format: 'date',
    ,

optionsB = 
    isStacked: true,
    hAxis: 
      gridlines: 
        count: 10
      ,
      format: 'percent',
    ,

Object.assign(optionsA.hAxis, optionsB.hAxis);
let newObj = Object.assign(, optionsB, optionsA);
console.log(newObj);

【讨论】:

好方法但对我不起作用,这是一个简单的对象示例,实际上我需要合并很多属性。 是的,我想这就是您要找的东西。希望有帮助:) ***.com/a/383245/4886453 感谢@tai-le 你救了我的一天! 酷 :) 很高兴知道。如果对你有帮助。让我们接受它:) 对不起@tai-le,但您评论中的答案实际上对我有帮助。 Object .assign 仅合并根属性,这对我不起作用

以上是关于Object.assign()合并对象的主要内容,如果未能解决你的问题,请参考以下文章

Object.assign() ,合并/覆盖键,复制数组的值以创建对象

合并对象与 Object.assign 覆盖内部对象而不合并 [重复]

js_Object.assign(对象的合并)

js 合并多个对象 Object.assign

es6 javascript对象方法Object.assign() 对象的合并复制等

纯原生仿ES6的Object.assign,实现深度合并对象