Javascript ImmutableJS-更新列表中的值
我有一个这样的映射(在ImmutableJS中): 我想更新“arrayOfValues”数组第二个条目中的值“inside”。我怎么做?这就是我现在看到的,上面写着“未捕获错误:无效密钥路径” 我也直接尝试了这个,但没有成功:Javascript ImmutableJS-更新列表中的值,javascript,reactjs,immutable.js,Javascript,Reactjs,Immutable.js,我有一个这样的映射(在ImmutableJS中): 我想更新“arrayOfValues”数组第二个条目中的值“inside”。我怎么做?这就是我现在看到的,上面写着“未捕获错误:无效密钥路径” 我也直接尝试了这个,但没有成功: theMap.setIn(['arrayOfValues',1,'one','inside'],'updated value'); 经过几个小时的寻找解决方案,我感谢任何帮助。谢谢。您的setIn示例的工作原理与您在本手册中应该看到的一样: 您可能认为的值会因设置而
theMap.setIn(['arrayOfValues',1,'one','inside'],'updated value');
经过几个小时的寻找解决方案,我感谢任何帮助。谢谢。您的
setIn
示例的工作原理与您在本手册中应该看到的一样:
您可能认为的值会因设置而改变
由于这些结构是不可变的,因此必须在新变量中捕获修改后的值,如var theMap2=theMap.setIn(['arrayOfValues',1,'one','inside','updated value')代码>您所做的是正确的(请参见此)
调用orig.setIn()
时,它不会直接修改orig
。这就是这个不可变的库的全部目的。它不会改变现有数据,而是从现有数据创建一个新数据
activePane是我必须修改的数组(列表)中对象的索引
你的例子对我来说没有错误。你不能更新不可变的结构。所以“它不会改变现有的数据,而是从现有的数据中创建一个新的数据”-这是否符合逻辑,即我们要将新对象作为状态返回?这有点模糊me@steveinatorx:没错。您应该将新对象(updated
)作为状态返回orig
仍指旧数据(即,更新!==orig
)
theMap.update('arrayOfValues',(list)=>{
return list.setIn([1,'one','inside'],'updated value');
})
theMap.setIn(['arrayOfValues',1,'one','inside'],'updated value');
const orig = Immutable.fromJS({
arrayOfValues: [
{ one: { inside: 'first in array' } },
{ one: { inside: 'second in array' } },
]
});
const updated = orig.setIn(['arrayOfValues', 1, 'one', 'inside'], 'updated value');
console.log(updated.toJS());
// {
// arrayOfValues: [
// { one: { inside: 'first in array' } },
// { one: { inside: 'second in array' } },
// ]
// }
case CHANGE_SERVICE:
var obj = {
title: '1212121 Tab',
service: '',
tagName: '',
preDefinedApi: '',
methodType: '',
url: '',
urlParams: [{
label: '',
name: '',
value: '',
}],
headers: [{
label: '',
name: '',
value: '',
}],
};
var activePane = state.get('activePane');
var panes = state.setIn(['panes', activePane, 'service'], action.val);
return state.setIn(['panes', activePane, 'service'], action.val);