2015-08-01 8 views
10

Ich habe eine Karte wie folgt aus (in ImmutableJS):ImmutableJS - update Wert in einer Liste

{arrayOfValues: [ 
    {one: {inside: 'first in array'}}, 
    {one: {inside: 'second in array'}} 
]} 

Und ich mag den Wert "innen" in dem zweiten Eintrag in der "arrayOfValues" Array aktualisieren. Wie kann ich es tun? Das ist, was ich habe jetzt, und es sagt „Nicht abgefangene Fehler: ungültige keyPath“

theMap.update('arrayOfValues',(list)=>{ 
    return list.setIn([1,'one','inside'],'updated value'); 
}) 

Ich versuchte auch direkt diese und es hat nicht funktioniert:

theMap.setIn(['arrayOfValues',1,'one','inside'],'updated value'); 

Nach mehreren Stunden der Suche nach der Lösung Ich schätze jede Hilfe. Vielen Dank.

+0

Ihr Beispiel funktioniert für mich ohne Fehler. – Artem

+0

Sie können unveränderliche Strukturen nicht aktualisieren. – dandavis

Antwort

2

Ihr setIn Beispiel funktioniert, wie Sie in diesem plunkr sehen sollte: als Folge des setInhttp://plnkr.co/edit/1uXTWtKlykeuU6vB3xVO?p=preview

Vielleicht ist der Wert von theMap geändert werden Sie davon aus?

Da diese Strukturen sind unveränderlich, Sie den geänderten Wert in einer neuen Variablen als var theMap2 = theMap.setIn(['arrayOfValues',1,'one','inside'],'updated value');

12

korrekt erfassen müssen Was Sie tun, ist (siehe diese JSBin).

const orig = Immutable.fromJS({ 
    arrayOfValues: [ 
    { one: { inside: 'first in array' } }, 
    { one: { inside: 'second in array' } }, 
    ] 
}); 

const updated = orig.setIn(['arrayOfValues', 1, 'one', 'inside'], 'updated value'); 

console.log(updated.toJS()); 

// { 
// arrayOfValues: [ 
//  { one: { inside: 'first in array' } }, 
//  { one: { inside: 'second in array' } }, 
// ] 
// } 

Wenn Sie orig.setIn() nennen, es orig nicht direkt ändern. Das ist der ganze Zweck dieser Immutable Bibliothek. Es mutiert nicht die vorhandenen Daten, sondern erstellt eine neue aus der bestehenden.

+0

so "Es mutiert nicht die vorhandenen Daten, sondern erzeugt eine neue aus der bestehenden" - würde es logisch folgen, dass wir das neue Objekt als Zustand zurückgeben sollen? bisschen fuzzy auf das für mich – steveinatorx

+1

@steveninatorx: Das ist richtig. Sie sollten das neue Objekt ("aktualisiert") als Status zurückgeben. 'orig' bezieht sich immer noch auf die alten Daten (d. h.' updated! == orig') –

0

activePane is the index of Object in Array(List) that I had to modify

case CHANGE_SERVICE: 
    var obj = { 
    title: '1212121 Tab', 
    service: '', 
    tagName: '', 
    preDefinedApi: '', 
    methodType: '', 
    url: '', 
    urlParams: [{ 
     label: '', 
     name: '', 
     value: '', 
    }], 
    headers: [{ 
     label: '', 
     name: '', 
     value: '', 
    }], 
    }; 
    var activePane = state.get('activePane'); 
    var panes = state.setIn(['panes', activePane, 'service'], action.val); 

    return state.setIn(['panes', activePane, 'service'], action.val); 
Verwandte Themen