如何更新不可变列表中的特定值?
How do I update a specific value inside an Immutable List?
我正在研究 redux Architecture, trying to use Immutable.js。
这是我的谜...给定这个状态:
var state = Immutable.fromJS([
{"id":0, "url":"http://someUrl", "thumb_url":"http://someUrl", "other_url":"http://someUrl"},
{"id":3, "url":"http://someUrl", "thumb_url":"http://someUrl", "alternative_url":"http://someUrl"},
{"id":1, "url":"http://someUrl", "thumb_url":"http://someUrl", "alternative_url":"http://someUrl"},
{"id":5, "url":"http://someUrl", "thumb_url":"http://someUrl", "yet_another_url":"http://someUrl"}
])
...我想更新一个url
。我试过像这样更新第三个 index
的 url
:
var index = 2;
var new_item = { id: 1, url: 'my_new_url' };
var state = state.setIn([index], new_item);
我的问题是我只需要更新 url
(或 thumb_url
等其他属性),而所有未更改的属性都保持不变。我有一个 new_item
,我想将其中的相关更新部分插入到给定索引中。我该怎么做才能做到这一点而不对旧项目的每个个体 属性 进行递归并且不丢失现有属性?
当我说 "update" 时,我的意思是创建一个新的 state
并将旧值更改为新值,因为通常使用 Immutable.js.
谢谢!
setIn will set a new value, which will overwrite your previous value, you may want a mergeIn 将新属性合并到原始值。
var state = Immutable.fromJS([
{"id":0, "url":"http://someUrl", "thumb_url":"http://someUrl", "other_url":"http://someUrl"},
{"id":3, "url":"http://someUrl", "thumb_url":"http://someUrl", "alternative_url":"http://someUrl"},
{"id":1, "url":"http://someUrl", "thumb_url":"http://someUrl", "alternative_url":"http://someUrl"},
{"id":5, "url":"http://someUrl", "thumb_url":"http://someUrl", "yet_another_url":"http://someUrl"}
])
var index = 2;
var new_item = { id: 1, url: 'my_new_url' };
var state = state.mergeIn([index], new_item);
console.log(state.toJS())
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.7.5/immutable.min.js"></script>
我正在研究 redux Architecture, trying to use Immutable.js。
这是我的谜...给定这个状态:
var state = Immutable.fromJS([
{"id":0, "url":"http://someUrl", "thumb_url":"http://someUrl", "other_url":"http://someUrl"},
{"id":3, "url":"http://someUrl", "thumb_url":"http://someUrl", "alternative_url":"http://someUrl"},
{"id":1, "url":"http://someUrl", "thumb_url":"http://someUrl", "alternative_url":"http://someUrl"},
{"id":5, "url":"http://someUrl", "thumb_url":"http://someUrl", "yet_another_url":"http://someUrl"}
])
...我想更新一个url
。我试过像这样更新第三个 index
的 url
:
var index = 2;
var new_item = { id: 1, url: 'my_new_url' };
var state = state.setIn([index], new_item);
我的问题是我只需要更新 url
(或 thumb_url
等其他属性),而所有未更改的属性都保持不变。我有一个 new_item
,我想将其中的相关更新部分插入到给定索引中。我该怎么做才能做到这一点而不对旧项目的每个个体 属性 进行递归并且不丢失现有属性?
当我说 "update" 时,我的意思是创建一个新的 state
并将旧值更改为新值,因为通常使用 Immutable.js.
谢谢!
setIn will set a new value, which will overwrite your previous value, you may want a mergeIn 将新属性合并到原始值。
var state = Immutable.fromJS([
{"id":0, "url":"http://someUrl", "thumb_url":"http://someUrl", "other_url":"http://someUrl"},
{"id":3, "url":"http://someUrl", "thumb_url":"http://someUrl", "alternative_url":"http://someUrl"},
{"id":1, "url":"http://someUrl", "thumb_url":"http://someUrl", "alternative_url":"http://someUrl"},
{"id":5, "url":"http://someUrl", "thumb_url":"http://someUrl", "yet_another_url":"http://someUrl"}
])
var index = 2;
var new_item = { id: 1, url: 'my_new_url' };
var state = state.mergeIn([index], new_item);
console.log(state.toJS())
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.7.5/immutable.min.js"></script>