2016-04-11 3 views
19

Ich bin auf der Suche nach einer reinen Funktion, mein unveränderliches Statusobjekt zu ändern. Der ursprüngliche als Parameter angegebene Zustand muss unberührt bleiben. Dies ist besonders nützlich beim Arbeiten mit Frameworks wie Redux und macht das Arbeiten mit immutable Objekt in Javascript viel einfacher. Zumal das Arbeiten mit dem Objektspreiz-Operator über Babel bereits möglich ist.Was ist der kürzeste Weg, um unveränderliche Objekte mit Spread-und Destrukturierung Operatoren zu ändern

ich etwas besser als zuerst das Objekt kopieren und als assign/löschen Sie die Eigenschaft ich so nicht gefunden werden soll:

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

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

Ich fühle mich wie es

kürzer sein könnte

Antwort

42

Aktionen auf Zustand, wo Staat als unveränderlich betrachtet wird.

Hinzufügen oder Aktualisieren des Wertes einer Eigenschaft:

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

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

Löschen einer Eigenschaft

// 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

Beantworten Sie Ihre eigene Frage Sekunden nach der Frage ?! – ColinE

+8

Ich habe das Feld unter dem Frageformular verwendet, um es zu beantworten, da ich die Lösung vor dem Posten der Frage gefunden habe. Da das googeln ziemlich schwierig ist, habe ich es für jeden hier gemacht. – Tarion

+0

Aber eigentlich ist das Entfernen einer Eigenschaft auch eine interessante Frage. Da das Festlegen einer Eigenschaft auf undefiniert ist, wird der Schlüssel nicht entfernt, und Löschen scheint innerhalb von Objektdefinitionen nicht zu funktionieren;) – Tarion

7

Eine ES6 Lösung, die ein bisschen mehr hat Unterstützung ist Object.assign:

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

Sicher, das ist das gleiche in ES5-Stil. – Tarion

+0

Eigentlich ES6 Stil. Die von Ihnen verwendete Objektverteilung ist ES7. –

+0

Sorry muss die Frage dann aktualisieren. Mit Babel es6 + Plugin dafür;) Etwas verwirrt. – Tarion

0

Entfernen von Artikel aus einem Array, verwenden Sie einfach Filter;)

CASE 'REMOVE_ITEM_SUCCESS': 

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

     return { 
      ...state, 
      items 
     } 
Verwandte Themen