Как использовать оператор распространения, чтобы добавить свойство к объекту, а не переопределить его? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть эта функция.

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

Но каждый раз, когда я хочу обновить свойство 'settings', я должен передать все его в данные:

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

Есть лиспособ обновить свойство 'settings' в этой функции без необходимости переписывать его целиком?Я просто хочу обновить свойство, а не переопределять его.

1 Ответ

1 голос
/ 12 апреля 2019

Есть ли способ обновить свойство '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 в новом объекте с заменой settings, в котором мы распространяем newdata.settings.

...