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
}));
});
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