2016-04-11 20 views
19

Poszukuję czystej funkcji, aby zmodyfikować mój niezmienny obiekt stanu. Oryginalny stan podany jako parametr musi pozostać nietknięty. Jest to szczególnie przydatne podczas pracy z frameworkami takimi jak Redux i znacznie ułatwia pracę z obiektem immutable w javascript. Zwłaszcza, że ​​praca z operatorem rozprzestrzeniania obiektu przy użyciu Babel jest już możliwa.Jaki jest najkrótszy sposób modyfikowania niezmiennych obiektów za pomocą operatorów spreadu i destruktury

nie znalazłem nic lepszego niż pierwsza kopia obiektu, a od przypisać/usunąć właściwość chcę tak:

function updateState(state, item) { 
    newState = {...state}; 
    newState[item.id] = item; 
    return newState; 
} 

function deleteProperty(state, id) { 
    var newState = {...state}; 
    delete newState[id]; 
    return newState; 
} 

czuję się jak to może być krótszy

Odpowiedz

42

Działania na rzecz państwa, gdzie stan jest uważany za niezmienny.

Dodawanie lub aktualizacji wartości właściwości:

// ES6: 
function updateState(state, item) { 
    return Object.assign({}, state, {[item.id]: item}); 
} 

// With Object Spread: 
function updateState(state, item) { 
    return { 
    ...state, 
    [item.id]: item 
    }; 
} 

Usuwanie właściwości

// ES6: 
function deleteProperty(state, id) { 
    var newState = Object.assign({}, state); 
    delete newState[id]; 
    return newState; 
} 

// With Object Spread: 
function deleteProperty(state, id) { 
    let {[id]: deleted, ...newState} = state; 
    return newState; 
} 

// Or even shorter as helper function: 
function deleteProperty({[id]: deleted, ...newState}, id) { 
    return newState; 
} 

// Or inline: 
function deleteProperty(state, id) { 
    return (({[id]: deleted, ...state}) => state)(state); 
} 
+2

Odpowiedzi na własne pytanie sekund po zapytaniu ?! – ColinE

+8

Użyłem pola pod formularzem pytania, aby na nie odpowiedzieć, ponieważ znalazłem rozwiązanie przed opublikowaniem pytania. Ponieważ szukanie go w Google jest dość trudne, umieszczam je dla wszystkich tutaj. – Tarion

+0

Ale tak naprawdę interesujące jest również usunięcie nieruchomości. Ponieważ ustawienie właściwości na undefined, nie usuwa klucza, a usuwanie nie działa w definicjach obiektów;) – Tarion

7
roztwór

ES6, który ma nieco więcej nośnikiem jest Object.assign:

const updateState = (state, item) => Object.assign({}, state, { [item.id]: item }); 
+0

Oczywiście, to samo w stylu ES5. – Tarion

+0

Właściwie w stylu ES6. Rozpowszechniony obiekt to ES7. –

+0

Przepraszamy, ale musisz zaktualizować pytanie. Używanie babel es6 + do tego;) Trochę się myli. – Tarion

0

Usuwanie elementu z tablicy, po prostu użyj filtra;)

CASE 'REMOVE_ITEM_SUCCESS': 

     let items = state.items.filter(element => element._id !== action.id); 

     return { 
      ...state, 
      items 
     } 
Powiązane problemy