如何更新不可变列表中的特定值?

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。我试过像这样更新第三个 indexurl

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>