2016-12-27 5 views
0

Ich brauche ein wenig Hilfe beim Aktualisieren eines inneren Elements eines Objekts mit Object.assign in meinem Redux Reducer.Aktualisieren eines inneren Elements eines Objekts mit Object.assign

Um das Szenario besser zu erklären, verwende ich NBA-Teams. Ich habe ein NBA-Objekt in meinem Redux-Shop. Ich versuche jetzt nur die TeamMembers für ein bestimmtes Team zu aktualisieren. Meine NBA Objekt sieht wie folgt aus:

{ 
    teams: [ 
     { 
      teamId: 123, 
      teamName: "Los Angeles Lakers" 
      teamMembers: [ 
      {id: "kbryant", fullName: "Kobe Bryant"}, 
      {id: "bingram", fullName: "Brandon Ingram"} 
      ] 
     }, 
     { 
      teamId: 234, 
      teamName: "Miami Heat" 
      teamMembers: [ 
      {id: "cbosh", fullName: "Chris Bosh"}, 
      {id: "tjohnson", fullName: "Tyler Johnson"} 
      ] 
     } 
    ] 
} 

ich beide teamid und Mitglieder des Minderer durch meine Aktion heißt action.teamId und action.members passieren.

Dies ist, was ich bisher:

Object.assign({}, state, { 
    nba: Object.assign({}, state.nba, { 
     teams: Object.assign({}, state.nba.teams, { 
     teamId[action.teamId] // I'm stuck here... 
     }) 
    }) 
}) 

Wie aktualisiere ich die Mitglieder einer bestimmten Mannschaft? Ich weiß, dass ich fast da bin, aber ich könnte ein wenig Hilfe gebrauchen. Vielen Dank.

+1

Mögliches Duplikat von [Aktualisierung verschachtelter Daten im Redux-Speicher] (http://stackoverflow.com/questions/32135779/updating-nested-data-in-redux-store) –

+0

Kein Duplikat. Auch die Vorschläge zu dieser Frage gelten nicht. Ich verwende nur Object.assign. – Sam

+0

Sie könnten den relevanten 'Object.assign' Aufruf in ein [IIFE] (http://benalman.com/news/2010/11/immediately-invoked-function-expression/) wickeln und einige Arbeiten darin erledigen, einschließlich jede Datenmutation. Stellen Sie sicher, dass Sie das neue Objekt, das von 'Object.assign()' erstellt wurde, mutieren und zurückgeben. –

Antwort

1

Sie könnten den Code erweitern, den Sie mit einer dynamischen Indexeigenschaft hatten, mit der angegeben werden soll, welcher Eintrag im Array teams aktualisiert werden muss. Die ES6-Syntax ermöglicht dynamische Eigenschaften in Objektliteralen, indem der dynamische Ausdruck in eckige Klammern gesetzt wird: { [index]: value }, wobei index eine Variable oder ein anderer Ausdruck ist.

Hier ist die endgültige Lösung:

function getNewState(state, action) { 
 
    var index = state.nba.teams.findIndex(t => t.teamId == action.teamId); 
 
    if (index == -1) return state; // team not found 
 
    return Object.assign({}, state, { 
 
     nba: Object.assign({}, state.nba, { 
 
      teams: Object.assign([], state.nba.teams, { 
 
       [index]: Object.assign({}, state.nba.teams[index], { 
 
        teamMembers: action.teamMembers 
 
       }) 
 
      }) 
 
     }) 
 
    }); 
 
} 
 

 
var state = { 
 
    nba: { 
 
     teams: [{ 
 
      teamId: 123, 
 
      teamName: "Los Angeles Lakers", 
 
      teamMembers: [ 
 
       {id: "kbryant", fullName: "Kobe Bryant"}, 
 
       {id: "bingram", fullName: "Brandon Ingram"} 
 
      ] 
 
     }, { 
 
      teamId: 234, 
 
      teamName: "Miami Heat", 
 
      teamMembers: [ 
 
       {id: "cbosh", fullName: "Chris Bosh"}, 
 
       {id: "tjohnson", fullName: "Tyler Johnson"} 
 
      ] 
 
     }] 
 
    } 
 
}; 
 

 
var action = { teamId: 123, teamMembers: [{id: "lnance", fullName: "Larry Nance"}] }; 
 
var newState = getNewState(state, action); 
 
console.log(newState);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Beachten Sie, dass diese Art von Manipulation viel einfacher mit einer Bibliothek wie Immutable wird.

+0

Ich denke, das ist eine ziemlich gute Lösung, das heißt, den Index herauszufinden und dann die Werte zu aktualisieren. Es dauerte noch eine Weile, bis ich zur Arbeit kam.Nach dem Debuggen für eine Weile, während ich versuchte, herauszufinden, was passiert, wurde mir während des Updates klar, dass ich - weil ich Object.assign verwende - TeamMembers von einem Array in ein Objekt umwandelte, das den Rest meines Codes durchbrach. Anstatt also Object.assign zu verwenden, um eine neue Kopie von teamMembers zu erstellen, habe ich stattdessen slice benutzt und es hat gut funktioniert. Ich werde in die unveränderliche Bibliothek schauen. Vielen Dank. – Sam

+0

Gut zu hören, es hat geklappt. Ich denke, "Object.assign" sollte auch funktionieren, aber indem Sie ein leeres Array als erstes Argument angeben, um sicherzustellen, dass es immer ein Array ist: 'Object.assign ([], ...)'. Ich habe es gerade aktualisiert. Aber 'Slice' ist natürlich auch in Ordnung. – trincot

+0

Ich wusste nicht, dass ich Object.assign mit einem leeren Array verwenden könnte. Habe gerade noch eine Sache gelernt. Du warst super hilfreich. Schätze es wirklich! Ich stimme deine Antwort ab. – Sam

Verwandte Themen