2016-04-01 4 views
1

Я использую immutable.js, моя структура данных, как:Изменение одного элемента в списке В immutable.js

class ItemList extends Record({ 
    items: new List() 
}) 

Я хочу написать функцию, изменить один пункт в этом списке и держать другу одна и та же. Например, список {1, 2, 3, 4}, мне нужна функция, если элемент равен 2, изменить его на 5.

я использую что-то вроде

updateInfo(updatedInfo) { 
    return this.withMutations(itemList => { 
     itemList.set('items', list); 
    }); 
} 

Мой вопрос находится в этой функции, как я могу просто обновить один элемент? где я должен поставить решение?

Спасибо!

+0

То же, что https://stackoverflow.com/questions/29589753/how-to-update-element-inside-list-with-immutablejs –

ответ

3

NB: Как уже упоминалось в другом ответе, существует недокументированный метод indexOf, который может быть проще использовать в некоторых случаях, принимая только значение, которое можно найти в качестве параметра.

Использование findIndex найти индекс стоимости вам нужно изменить и set с индексом изменения:

list = Immutable.List.of(1, 2, 3, 4); 

list = list.set(list.findIndex(function(item) { 
    return item === 2; 
}), 5); 

ES6:

list = list.set(list.findIndex((item) => item === 2), 5); 

Если вам нужно старое значение, чтобы изменить его , вы можете использовать update вместо установленных:

list = list.update(list.findIndex(function(item) { 
    return item === 2; 
}), function(oldValue) { 
    return 5; 
}); 

ES6:

list = list.update(list.findIndex((item) => item === 2), (oldValue) => 5); 
+0

Я как-то ошибся: list.set не является функцией – mlin956

5

Это очень просто.

list = Immutable.List.of(1, 2, 3, 4); 
list = list.set(list.indexOf(2), 5); 

console.log(list.get(1)); //5 
0

Очень чистый вариант, основанный на forEach. Его SideEffect (мутирует в противном случае неизменного список), так что синтаксис похож на использование изменяемого списка -

var list = Immutable.List.of(1, 2, 3, 4); 

// Notice no LHS assignment is required as 
// forEach is a side-effect method. 
list.forEach((value, index, theList) => { 
    // You can check either value, or index 
    if (index === soAndSo 
     || value.something === something){ 

     // Just change the value! 
     value.prop = someNewValue; 

     // Or, in the above case where value 
     // is not a reference 
     theList.set(index) = newValue; 

     // As we found and changed the value 
     // of interest, lets exit forEach 
     return false; 
    } 
}); 

И да, есть версия для карты тоже.

Смежные вопросы