2016-05-13 11 views
0

Pushing verschachtelte Daten in eine Karte in einer Liste zu aktualisierenImmutable js eine Karte in einer Liste

Kann mir jemand sagen:
Wie schiebe ich eine Aufgabe zu einem dieses Benutzer (Listenelemente) im Idealfall von bestimmten Benutzern Ich würde?

Vielen Dank im Voraus.

Mein Code:

const initialState = Immutable.List([ 
    Immutable.Map({ 
    "id": 1, 
    "name": "Abe Bell", 
    "tasks": [ 
     { 
     "id": 1, 
     "title": "Get haircut", 
     "status": false 
     } 
    ] 
    }), 
    Immutable.Map({ 
    "id": 2, 
    "name": "Chad Dim", 
    "tasks": [ 
     { 
     "id": 2, 
     "title": "Get real job", 
     "status": false 
     } 
    ] 
    }) 
]) 
+0

Gibt es einen guten Grund, warum Ihr Staat auf diese Weise strukturiert ist? Meiner Meinung nach können Sie dies vereinfachen, um nur Karten zu verwenden. Obwohl es möglich ist, die aktuelle Struktur vollständig zu bearbeiten, ist sie unnötig komplex. Als generische Regel bevorzugen Sie die Map-over-Liste aus Gründen der Performance/Einfachheit, wo immer dies möglich ist. – hazardous

Antwort

0

Zuerst wird die Art und Weise Sie diese Struktur Gebäude sind, die tasks Array wird nicht eine unveränderliche Instanz sein, ich denke, das ist nicht das, was Sie wollen, können Sie Immutable.fromJS verwenden zu transformieren Alle verschachtelten Arrays und Maps in eine unveränderbare Instanz.

Wie Ihre Daten strukturiert sind, müssen Sie durch die Liste der Benutzer navigieren und das Update durchführen, wenn die ID übereinstimmt.

Eine Möglichkeit, dies zu tun ist mit map

const initialState = Immutable.fromJS([ 
    { 
    "id": 1, 
    "name": "Abe Bell", 
    "tasks": [ 
     { 
     "id": 1, 
     "title": "Get haircut", 
     "status": false 
     } 
    ] 
    }, 
    { 
    "id": 2, 
    "name": "Chad Dim", 
    "tasks": [ 
     { 
     "id": 2, 
     "title": "Get real job", 
     "status": false 
     } 
    ] 
    } 
]); 

let userId = 2; 

let newState = initialState.map(user => { 
    if (user.get('id') !== userId) { 
    return user; 
    } 
    return user.update('tasks', tasks => {  
    return tasks.push(Immutable.fromJS({ 
     id: 3, 
     title: "new task", 
     status: false 
    })) 
    }); 
}); 

Obwohl dies tun, was Sie wollen, ich glaube, Sie Ihre Daten auf eine Karte statt einer Liste, wenn diese Art von Operation ist immer wieder etwas ändern sollen in Ihre Bewerbung. Dies wird die Dinge einfacher und schneller machen.

const initialState = Immutable.fromJS({ 
    "1": { 
    "id": 1, 
    "name": "Abe Bell", 
    "tasks": [ 
     { 
     "id": 1, 
     "title": "Get haircut", 
     "status": false 
     } 
    ] 
    }, 
    "2": { 
    "id": 2, 
    "name": "Chad Dim", 
    "tasks": [ 
     { 
     "id": 2, 
     "title": "Get real job", 
     "status": false 
     } 
    ] 
    } 
}); 

let userId = "2"; 

let newState = initialState.updateIn([userId, 'tasks'], tasks => { 
    return tasks.push(Immutable.fromJS({ 
    id: 3, 
    title: "new task", 
    status: false 
    })); 
});