我正在使用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);
});
}
我的问题是在这个功能中,我怎样才能更新一个项目?我应该把if判断放在哪里?
谢谢!
答案 0 :(得分:6)
很容易。
list = Immutable.List.of(1, 2, 3, 4);
list = list.set(list.indexOf(2), 5);
console.log(list.get(1)); //5
答案 1 :(得分:4)
注意:正如另一个答案所提到的,还有一个未记录的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);
答案 2 :(得分:0)
基于forEach的更清洁版本。它是一个副作用(改变了一个不可变的列表),所以语法类似于使用一个可变列表 -
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;
}
});
是的,还有Map的版本。