为什么Immutable.js在Map.setIn()上抛出无效的键路径

时间:2016-06-08 21:02:38

标签: javascript immutable.js

我必须在这里遗漏一些东西,因为Docs表示好像下面的代码应该可以正常工作但我得到一个无效的密钥路径错误...检查this codepen

var map1 = Immutable.Map({ 'selector': { 'type': 'bar' }});
var map2 = map1.setIn(['selector', 'type'], 'foo');
console.log(map2.toJS());

2 个答案:

答案 0 :(得分:30)

这是因为键'selector'具有非Map值。 如果我们确保setIn的值也是不可变地图,'selector'将有效:

var map1 = Immutable.Map({ 'selector': Immutable.Map({ 'type': 'bar' })});
var map2 = map1.setIn(['selector', 'type'], 'foo');
console.log(map1.toJS());  
console.log(map2.toJS());
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

要将JavaScript对象和数组深度转换为地图和列表,您可以使用fromJS()。所以你可以更容易地写:

var map3 = Immutable.fromJS({ 'selector': { 'type': 'bar' }});
var map4 = map3.setIn(['selector', 'type'], 'foo');
console.log(map3.toJS());  
console.log(map4.toJS());
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

答案 1 :(得分:-1)

类似的事情发生在我身上:

我试图像这样访问一个简单的选择器:

@reboot /sbin/iw dev wlan0 set power_save off&

这也会引发同样的错误