2017-10-18 1 views
-1

I wie dieser eine Antwort von einer API haben:Wie für den Zugriff auf Array von Objekten Subelement von redux Reduzierungen

[{ 
    "id": 1, 
    "name": "Microsoft", 
    "status": true, 
    "consoles": [{ 
     "id": 4, 
     "name": "Xbox", 
     "status": true, 
     "subconsoles": [{ 
      "id": 7, 
      "name": "Xbox 360", 
      "status": true, 
      "subconsoles": [] 
     }, 
    { 
      "id": 90, 
      "name": "Xbox One", 
      "status": false, 
      "subconsoles": [{ 
      "id": 21, 
      "name": "Xbox One S", 
      "status": true, 
      "subconsoles": [] 
     }, 
     { 
      "id": 12, 
      "name": "Xbox One X", 
      "status": false, 
      "subconsoles": [{ 
       "id": 41, 
       "name": "Xbox One X model 1", 
       "status": false, 
       "subconsoles": [] 
      }] 
     }] 
     }] 
    }] 
}] 

Hier sind auch die Daten im praktischen Format:

Online JSON Viewer

Was Ich versuche zu erreichen ist, den Status der Subkonsolen zu ändern. So von Layoutbereich passiere ich die ID von dem, was ich ändern will, aber ich bin wirklich stecken, wie das Unterelement zuzugreifen (und schließlich das Unter Subelement) in den Reduzierungen von Redux:

case SUBCONSOLES_ENABLE: 
return { 
    ...state, 
    id: action.payload.subconsoleId, 
    ..... 
} 
+0

Können Sie einige tatsächliche Daten anzeigen? Dies scheint falsch zu sein –

+0

Ich habe ein Bild mit der JSON-Ansicht auf eine nette Weise hinzugefügt. – Mark

Antwort

1

Sie würden Sie müssen eine Kopie jedes der Arrays in Ihrem Zustand erstellen, bevor Sie sie ändern können, um Ihren Status unveränderlich zu halten. Bei so vielen Ebenen würde das schnell kompliziert werden!

case SUBCONSOLES_ENABLE: 
let newState = [...state]; //create copy of state array 
..... //find the index of the object in the newState array which you would want to change 
let newConsoles = [...newState[index].consoles]; //create a copy of consoles 
.....   //find the index of the object in the newConsoles array which you would want to change 
let newSubConsoles = [...newConsoles[index2].subconsoles];//create a copy of subconsoles 
let subConsole = newSubConsoles.find((a)=>a.id===action.payload.subconsoleId); //find the object in the newConsoles array which you would want to change 
    let newSubConsole = {...subConsole}    //make a copy of your object 
    .....           //make your changes to the copy 
               //replace the old object with the new object in newSubConsoles 
               //replace subConsoles array with newSubConsoles array in newConsoles 
               // replace consoles array with newConsoles array in new State. 
//and finally!!           
return newState; 

Basierend auf der Form des Staates, würde ich bei normalizing your state und mit Immutable.js

Verwandte Themen