2016-04-21 17 views
9

Dato uno stato come questo:Come rimuovere un oggetto da una matrice in Immutable?

state = { 
    things: [ 
    { id: 'a1', name: 'thing 1' }, 
    { id: 'a2', name: 'thing 2' }, 
    ], 
}; 

Come si crea un nuovo stato in cui viene rimosso ID "a1"? E 'abbastanza facile da spingere nuovi elementi:

return state.set(state.get('things').push(newThing)); 

Ma io non riesco a capire come cercare e rimuovere un oggetto dalla sua proprietà id. Ho provato questo:

return state.set('tracks', 
    state.get('tracks').delete(
    state.get('tracks').findIndex(x => x.get('id') === 'a2') 
) 
) 

Ma sembra disordinato, più esso funziona solo se l'articolo è trovato, perché se findIndex rendimenti -1, che è un valore valido per delete.

+0

'state.update ('cose', le cose => le cose. filter (cosa => cosa.get ('id')! == 'a2')); ' – zerkms

risposta

14

È possibile utilizzare Array#filter.

return state.set('things', state.get('things').filter(o => o.get('id') !== 'a1')); 
+0

Così semplice - a quanto pare mi stavo sforzando troppo di usare i metodi di Immutable :) Grazie! – ffxsam

+0

@ffxsam Benvenuto e grazie per la modifica. – Tushar

+0

C'è un avvertimento, questo restituirebbe sempre un nuovo valore immutabile, anche quando l'array non ha elementi corrispondenti. A seconda delle dimensioni della struttura, questo può essere qualcosa che vale la pena conoscere in quanto sconfiggerà efficacemente qualsiasi ottimizzazione di rendering fatta sulla base di confronti di stato immutabili in React. – hazardous

3

In alternativa, come sei "la ricerca e quindi l'eliminazione di" ...

var itemIndex = this.state.get("tracks").findIndex(x => x.get('id') === 'a2'); 

return itemIndex > -1 ? this.state.deleteIn(["tracks", itemIndex]) : this.state; 

Questo farà sì che lo Stato non è mutato, quando non ci sono cambiamenti.

0

Trovato questo thread durante la ricerca di una soluzione per un'attività simile. risolto con update metodo:

return state.update('things', (things) => things.filter((t) => t.id !== action.things.id)) 

qualche idea/commento che uno è migliore/preferito?

0

Quando si utilizza il filtro si itera tutto il ciclo -> un modo efficace sta trovando index => fetta e l'utilizzo di splitter ...

const index = state.findIndex(data => data.id === action.id); 

return [...state.slice(0, index), ...state.slice(index + 1)]; 
Problemi correlati