2016-01-16 3 views
0

Это вопрос бабуля/ES7 (для использования редуктора редуктора)В чем разница и/или предпочтительный способ обновления глубокого свойства?

Я хочу обновить «дан» только в некоторых свойствах. Каков предпочтительный способ ума неизменности?

Кажется, что только TRY 1 и TRY 3 сливаются/обновляются правильно.

Есть ли разница между двумя? Для меня TRY 3 победы, потому что это самый короткий (если нет никакой разницы между TRY 1)

Благодаря

const people = { byID: { 
    gaston : { name:'Gaston', age: 22 }, 
    dan : { name: 'gaston', age: 44 } 
    } 
} 

const currentID = "dan" 

/// 
// TRY 1 

const thisID = {} 
thisID[currentID] = {...people.byID[currentID], 
    age: 20, 
    sex: 'male', 
} 

const newPeople = {...people, 
    byID: {...people.byID, 
    ...thisID 
    } 
} 

console.log(newPeople ) // OK 

// 
// TRY 2 

const newPeople2 = {} 
newPeople2.byID = {} 
newPeople2.byID[currentID] = {} 
newPeople2.byID[currentID]["age"] = 20 
newPeople2.byID[currentID]["sex"] = "male" 

const newPeople3 = {...people, ...newPeople2} 

console.log(newPeople3) // NOPE (not merge) 

// 
// TRY 3 

const newPeople4 = {...people} 
newPeople4.byID = newPeople4.byID || {} 
newPeople4.byID[currentID] = newPeople4.byID[currentID] || {} 
newPeople4.byID[currentID]["age"] = 20 
newPeople4.byID[currentID]["sex"] = "male" 

console.log(newPeople4) // OK 

Вот выходы

TRY 1 

{"byID":{"gaston":{"name":"Gaston","age":22},"dan":{"name":"gaston","age":20,"sex":"male"}}} 

TRY 2 

{"byID":{"dan":{"age":20,"sex":"male"}}} 

TRY 3 

{"byID":{"gaston":{"name":"Gaston","age":22},"dan":{"name":"gaston","age":20,"sex":"male"}}} 

ответ

0

Использование оператора распространения, вы можете сделать:

const updatedPeople = { 
    byID: { 
    ...people.byID, 
    dan: { 
     ...people.byID.dan, 
     age: 20, 
     sex: "male" 
    } 
    } 
}; 

Если вам нужен идентификатор для динамического использования, используя вычисленные ключи свойств (Другая особенность ES6, часть деструктуризации):

const id = 'dan'; 

const updatedPeople = { 
    byID: { 
    ...people.byID, 
    [id]: { 
     ...people.byID[id], 
     age: 20, 
     sex: "male" 
    } 
    } 
}; 

Эти решения являются неизменность полное доказательство, хотя, если вы не знакомы с синтаксисом ES6, они могут быть трудно читать, и если у вас есть более сложные данные, может рассмотреть возможность использования immutablejs (или какой-то неизменной библиотеки)

Смежные вопросы