如何使用ImmutableJS Map设置嵌套数组中项的属性?

时间:2016-04-07 10:15:29

标签: javascript immutable.js

必须避免state对象中的任何突变。您能否建议如何使用Immutable.Map()按行更改行文本?

在这种情况下,

setIn函数似乎不适用于Map?

var state = {
    pages: [
        {
            tiles: [
                {
                    rows: [
                        {rowId: 'row1', text: 'text1'},
                        {rowId: 'row2', text: 'text2'},
                        {rowId: 'row3', text: 'text3'}
                        //...
                    ]
                },
                {
                    //...
                }
                //...
            ]
        }
        //...
    ]
};

function onRowUpdateAction(state, rowId, rowText) {
        var map = Immutable.Map(state);
        //TODO: Update row text by row id ?

        return map.toObject();
}
var newState = onRowUpdateAction(state, 'row2', 'updatedText');

提前致谢!

1 个答案:

答案 0 :(得分:0)

setIn可以很好地使用地图和列表。从你所写的问题看来,你实际上并没有处理深层不可变的结构。请注意,创建immutable.Map,例如

immutable.Map({a: {b: 'c'}})

创建带有键'a'和值{b: 'c'}的不可变Map(作为普通的JS对象)!难怪,不可变的getIn不能用它。

要使结构完全不可变,请使用immutable.fromJS(这可能是您打算使用的)。