2017-10-26 1 views
0

In Immutable.js wie kann ich ein Objekt aus einer Liste nach Index abrufen und eine Eigenschaft festlegen und dann die gesamte Liste aktualisieren.So erhalten Sie Objekte nach Index immutable.js

Der Status ist ein Array von Objekten namens artists.

[{ id: 1, selected: false}, { id: 2, selected: false}] 

Nun wünsche ich wahr ausgewählt set = bei Index 0

Ich habe versucht:

const artistItem = state.get(action.payload.index).set({ selected: true }); 
    const artists = state.get('artists').set(action.payload.index, artistItem); 

Wie kann ich dies erreichen, ohne die anderen Eigenschaften zu überschreiben?

Antwort

0

bearbeiten

ImmutableList.set() gibt eine weitere Liste mit den Änderungen. Dies ist der richtige Weg, um ein Element zu ändern:

const index = action.payload.index 
const newArtists = state.set(index, { ...state.get(index), selected: true }); 
... 
+0

Ich habe erwähnt, dass ich in den Objekten andere Eigenschaften aufweisen. Dies wird alle Eigenschaften ersetzen. Ich möchte die spezifische Eigenschaft aktualisieren. Ich habe das Ticket bearbeitet – user1526912

+0

@ user1526912 bearbeitet –

+0

Das hat nicht funktioniert – user1526912

0

Wenn Ihr Zustand wie

[{ id: 1, selected: false}, { id: 2, selected: false}] 
sieht wirklich

Ich glaube, Sie wollen List#update verwenden:

let state = Immutable.fromJS([ 
    {id: 1, selected: false}, 
    {id: 2, selected: false} 
]); 

state = state.update(0, (artist) => artist.set('selected', true)); 
console.log(state); // [{id: 1, selected: true}, {id: 2, selected: false}] 

// Note that this is equivalent to: 
state = state.set(0, state.get(0).set('selected')); 

Aber von Ihrem Code scheint es, dass Ihr Zustand tatsächlich eher wie

aussieht

Wenn dies der Fall ist, werden Sie Map#updateIn verwenden:

let state = Immutable.fromJS({ 
    artists: [ 
     {id: 1, selected: false}, 
     {id: 2, selected: false} 
    ] 
}); 

state = state.updateIn(['artists', 0], (artist) => artist.set('selected', true)); 
console.log(state); //{artists: [{id: 1, selected: true}, {id: 2, selected: false}] 

// Note that this is equivalent to: 
state = state.set(
    'artists', 
    state.get(artists).set(
    0, 
    state.get(artists).get(0).set('selected', true) 
)); 
Verwandte Themen