Как мне создать или заменить редактирование вложенного объекта с распространенным синтаксисом? - PullRequest
0 голосов
/ 15 октября 2018

Для простого распространения мы можем создать или заменить следующим образом:

let a = {1: "one", 2: "two"}; 
let b= {...a, ...{2: "too", 3: "three"}}
console.log(b); //{1: "one", 2: "too", 3: "three"}

То, что я хочу сделать, это нечто похожее, но для вложенного объекта:

let a = {
   title: "hello world", 
   nestedObject: {
      1: "one", 
      2: "two", 
   }
}; 

let b= {...a, ...{nestedObject: {2: "too", 3: "three"}}};
console.log(b); //Replaces the nested object entirely. 

Что я на самом деле хочу в результате:

{
   title: "hello world", 
   nestedObject: {
      1: "one", 
      2: "too",
      3: "three" 
   }
}; 

Как бы я этого достиг?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Я часто использую этот шаблон в редукторах Redux.Вот как я это делаю:

let a = {
   title: "hello world", 
   nestedObject: {
      1: "one", 
      2: "two", 
   }
}; 

let b = {
    ...a,
    nestedObject: {
        ...a.nestedObject, 
        2: "too",
        3: "three"
    }
};
console.log(b); //Replaces the nested object entirely. 

Обратите внимание, что теперь я использую nestedObject как просто имя свойства и задаю ему новый объект, который начинается с ...a.nestedObject.

* 1007.* Итак, это означает:
  • Добавить все из a
  • Переопределить nestedObject новым объектом (потому что он приходит ПОСЛЕ ...a)
  • В новый объект добавьте все из a.nestedObject
  • Затем добавьте (и переопределите все существующие) реквизиты в nestedObject, добавив реквизиты ПОСЛЕ ...a.nestedObject

Если вы ищетедля чего-то, что автоматически отменяет любое свойство на любом уровне, есть несколько легких пакетов NPM, таких как deep-assign .Он работает так же, как assign, но рекурсивно.

0 голосов
/ 15 октября 2018

Используйте ваш вложенный объект из исходного объекта.И распространять только это свойство

let a = {
   title: "hello world", 
   nestedObject: {
      1: "one", 
      2: "two", 
   }
}; 

let b= {...a, nestedObject: {...a.nestedObject, ...{2: "too", 3: "three"}}};
console.log(b); //Will not Replace the nested object entirely. 
...