var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Пояснення
Оновлення колекцій Immutable.js завжди повертає нові версії цих колекцій, залишаючи оригінал незмінним. Через це ми не можемо використовувати list[2].count = 4
синтаксис мутації JavaScript. Натомість нам потрібно викликати методи, як це можна зробити з колекційними класами Java.
Почнемо з більш простого прикладу: просто рахується у списку.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Тепер , якщо ми хочемо , щоб оновити 3 - й пункт, простий масив JS може виглядати наступним чином : counts[2] = 4
. Оскільки ми не можемо використовувати мутацію, і нам потрібно викликати метод, замість цього ми можемо використовувати: counts.set(2, 4)
- це означає встановити значення 4
в індексі 2
.
Глибокі оновлення
Приклад, який ви подали, вклав дані. Ми не можемо просто використовувати set()
в початковій колекції.
Колекції Immutable.js мають сімейство методів з іменами, що закінчуються на "В", які дозволяють вносити більш глибокі зміни в вкладений набір. Найбільш поширені методи оновлення мають відповідний метод "В". Наприклад для set
є setIn
. Замість того, щоб прийняти індекс або ключ як перший аргумент, ці методи "В" приймають "шлях ключа". Ключовий шлях - це масив індексів або ключів, який ілюструє, як дійти до значення, яке ви хочете оновити.
У вашому прикладі ви хотіли оновити елемент у списку в індексі 2, а потім значення за ключем "рахувати" всередині цього елемента. Отже, ключовим шляхом був би [2, "count"]
. Другий параметр setIn
методу працює так само set
, як нове значення, яке ми хочемо туди поставити, так:
list = list.setIn([2, "count"], 4)
Пошук правильного ключового шляху
Пройшовши ще крок далі, ви насправді сказали, що хочете оновити елемент, де ім'я "три", що відрізняється від просто 3-го елемента. Наприклад, можливо, ваш список не відсортований, або, можливо, пункт, названий "два", був видалений раніше? Це означає, що спершу нам потрібно переконатися, що ми справді знаємо правильний шлях ключа! Для цього ми можемо скористатися findIndex()
методом (який, до речі, працює майже так само, як Array # findIndex ).
Після того як ми знайшли індекс у списку, який містить елемент, який ми хочемо оновити, ми можемо надати ключовий шлях до значення, яке ми хочемо оновити:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
В оригінальному запитанні згадуються методи оновлення, а не встановлені методи. Я поясню другий аргумент у цій функції (називається updater
), оскільки він відрізняється від set()
. Хоча другий аргумент set()
- це нове значення, яке ми хочемо, другий аргумент update()
- це функція, яка приймає попереднє значення і повертає нове значення, яке ми хочемо. Потім, updateIn()
варіація "In", update()
яка приймає ключовий шлях.
Скажімо, наприклад, що ми хотіли змінити ваш приклад, який не просто встановив підрахунок 4
, а замість того, щоб збільшити існуючий підрахунок, ми могли б надати функцію, яка додає одну до існуючого значення:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)