如何使用扩展运算符将属性添加到对象,而不是覆盖它?

时间:2019-04-12 10:35:57

标签: javascript function object ecmascript-6 spread-syntax

我有这个功能。

function foo(newdata) { 
     utils.method('GET', '/auth', {
        response: {
          data: {
            settings: {
              last_email_notification_shown_date: new Date(),
              email_notifications: null,
            }
            ...newdata
          }
        }
      });
 }

但是每次我想更新'settings'属性时,我都必须将其 all 传递给数据:

foo(settings {
   last_email_notification_shown_date: new Date(),
   email_notifications: null,
   SomeNewProperty: 'whatever'
})

有没有一种方法可以更新此功能中的'settings'属性,而无需整体重写?我只想更新该属性,而不是覆盖它。

1 个答案:

答案 0 :(得分:1)

  

是否有一种方法可以更新此功能中的'settings'属性,而无需整体重写?

很难从您的问题中得知您实际上在做什么,但是如果目标是将newdata添加到现有设置中,那么您只是在错误的位置进行传播:

function foo(newdata) { 
     utils.method('GET', '/auth', {
        response: {
          data: {
            settings: {
              last_email_notification_shown_date: new Date(),
              email_notifications: null,
              ...newdata // <============================ moved
            }
          }
        }
      });
}

然后

foo({
   SomeNewProperty: 'whatever'
});

如果您需要用一个对象来调用foo,而该对象的对象在settings之外并且也在settings之内,那么会稍微复杂一些,但不会很多:

function foo(newdata) { 
     utils.method('GET', '/auth', {
        response: {
          data: {
            ...newdata,                     // <========================
            settings: {
              last_email_notification_shown_date: new Date(),
              email_notifications: null,
              ...newdata.settings           // <========================
            },
          }
        }
      });
}

然后

foo({
    settings: {
       SomeNewProperty: 'whatever'
    },
    otherStuff: "foo"
});

这会传播newdata(包括settings),然后在新对象中用替换newdata覆盖settings的{​​{1}},我们在其中替换传播settings