陷入Immutable.js setIn方法

时间:2016-04-20 06:18:56

标签: javascript immutable.js

我只是在Chrome版本50的Immutable.js docs控制台下测试以下代码,但它会发出错误消息:Uncaught Error: invalid keyPath(…)

var map1 = Immutable.Map({
    a: 1,
    b: {
        c: 1
    }
});

var map2 = map1.setIn(['b', 'c'], 2);

然后我将代码更改为:

var map1 = Immutable.fromJS({
    a: 1,
    b: {
        c: 1
    }
});

var map2 = map1.setIn(['b', 'c'], 2);

它运作正常。但为什么? fromJSMap之间的区别是什么?

2 个答案:

答案 0 :(得分:3)

MapList和其他方法深度将给定的数据结构转换为不可变的。在这种情况下,嵌套对象b仍然是不可变映射map1中的纯JavaScript对象。这是一个map1的控制台转储来描述相同的... enter image description here

这就是为什么你应该更喜欢fromJSdeeply converts the data structure into immutables。这是从map1电话中产生的fromJS转储 - enter image description here

请注意,b现在与Lt属于同一类型(地图缩写为map1)。

还有另一种方法可以进行深度转换 -

var map1 = Immutable.Map().merge({
    a: 1,
    b: {
        c: 1
    }
});

请注意merge internally invokes fromJS only:)。

答案 1 :(得分:0)

也许是.Map中的设置路径已经被使用,但它不在.fromJs

尝试更改设置路径。