2016-04-11 31 views
19

Sto cercando una funzione pura, per modificare il mio oggetto stato immutabile. Lo stato originale indicato come parametro non deve essere modificato. Ciò è particolarmente utile quando si lavora con framework come Redux e rende molto più facile lavorare con l'oggetto immutable in javascript. Soprattutto dal momento che lavorare con l'operatore di spread di oggetti usando Babel è già possibile.Qual è il modo più breve per modificare gli oggetti immutabili utilizzando operatori di diffusione e destrutturazione

non ho trovato nulla di meglio che prima copiare l'oggetto, e di assegnare/eliminare la proprietà che voglio in questo modo:

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

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

Mi sento come potrebbe essere più breve

risposta

42

azioni sullo stato, dove lo stato è considerato immutabile.

Aggiunta o aggiornamento del valore di una proprietà:

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

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

Eliminazione di una proprietà

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

Rispondere alla propria domanda pochi secondi dopo aver chiesto ?! – ColinE

+8

Ho usato il campo sotto il modulo domanda per rispondere, poiché ho trovato la soluzione prima di pubblicare la domanda. Dal googling per esso è piuttosto difficile l'ho messo per tutti qui questo era. – Tarion

+0

Ma in realtà, la rimozione di una proprietà è anche una domanda interessante. Poiché l'impostazione di una proprietà non è definita, la chiave non viene rimossa e l'eliminazione sembra non funzionare all'interno delle definizioni dell'oggetto;) – Tarion

7
soluzione

Un ES6, che ha un po 'più di supporto è Object.assign:

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

Certo, è lo stesso in stile ES5. – Tarion

+0

In realtà stile ES6. La diffusione dell'oggetto che hai usato è ES7. –

+0

Spiacente, devo aggiornare la domanda allora. Usando babel es6 + plugin per questo;) Sono un po 'confuso. – Tarion

0

Rimozione di un elemento da un array, utilizzare solo il filtro;)

CASE 'REMOVE_ITEM_SUCCESS': 

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

     return { 
      ...state, 
      items 
     } 
Problemi correlati