2016-04-21 19 views
9

Biorąc pod uwagę stan takiego:Jak usunąć obiekt z tablicy w niezmiennym?

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

Jak mogę utworzyć nowy stan, w którym ID „a1” jest usuwany? Jest to dość łatwe do pchania nowe pozycje:

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

Ale nie mogę dowiedzieć się, jak wyszukać i usunąć obiekt przez jego id nieruchomości. Próbowałem to:

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

Ale wydaje się brudny, plus to działa tylko wtedy, gdy element zostanie znaleziony, bo jeśli findIndex zwrotów -1, że to ważna wartość dla delete.

+0

'state.update („rzeczy”, rzeczy => rzeczy. filter (thing => thing.get ('id')! == 'a2'); ' – zerkms

Odpowiedz

14

Można użyć Array#filter.

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

Tak prosty - najwyraźniej próbowałem zbyt mocno, aby użyć metod Immutable :) Dzięki! – ffxsam

+0

@ffxsam Witaj i dziękuję za edycję. – Tushar

+0

Jest jedna uwaga, to zawsze zwróci nową niezmienną, nawet jeśli tablica nie ma pasujących elementów. W zależności od wielkości struktury może to być coś, co warto wiedzieć, ponieważ skutecznie pokona wszelkie optymalizacje renderowania wykonane na podstawie niezmiennych porównań stanu w React. – hazardous

3

Alternatywnie, jak jesteś „poszukiwania, a następnie usuwając” ...

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

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

Zapewni to, że państwo nie jest zmutowany, gdy nie ma żadnych zmian.

0

Znaleziono ten wątek, szukając rozwiązania podobnego zadania. rozwiązać go z update metody:

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

jakiś pomysł/komentarz, który z nich jest lepszy/preferowany?

0

Kiedy używasz filtra to iteracje cały cykl -> jeden skutecznym sposobem jest znalezienie indeks => plaster i za pomocą rozgałęźnika ...

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

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