更改列表中的一个项目在immutable.js中

时间:2016-04-01 21:43:10

标签: javascript redux 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);
    });
}

我的问题是在这个功能中,我怎样才能更新一个项目?我应该把if判断放在哪里?

谢谢!

3 个答案:

答案 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的版本。