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

时间:2015-11-26 14:54:21

标签: javascript redux immutable.js

我正在使用redux架构,尝试使用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。我已尝试更新第三个url的{​​{1}},如下所示:

index

我的问题是我只需更新var index = 2; var new_item = { id: 1, url: 'my_new_url' }; var state = state.setIn([index], new_item); (或其他属性,如url),保持所有未更改的属性不变。我有一个thumb_url我希望将相关的更新部分插入到给定的索引中。如何在不递归旧项目的每个单独属性且不丢失现有属性的情况下执行此操作?

当我说"更新"时,我的意思是创建一个新的new_item,旧的值更改为新的值,因为它与Immutable.js一样常见

谢谢!

1 个答案:

答案 0 :(得分:3)

setIn将设置一个新值,该值将覆盖您之前的值,您可能希望mergeIn将新attr合并为原始值。

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>