不可变的mergeIn会覆盖原始值

时间:2019-02-02 07:01:30

标签: immutable.js

在将Immutable.js与嵌套的地图和列表一起使用时,我遇到了问题,我期望mergeIn会将新值与旧值合并,但是它将覆盖该值。

如何正确获取它?

const state = fromJS({
  list: []
})
  .update("list", l => l.push({ a: 1 }))
  .mergeIn(["list", 0], { b: 3 })
  .getIn(["list", 0])

我期望最终值为{ a: 1, b: 3 },但是实际输出为{ b: 3 }

2 个答案:

答案 0 :(得分:0)

Immutable.js不应合并这样的普通对象(无论如何在v4之前)。

state.mergeIn(["list", 0], { b: 3 })

等效于

state.updateIn(["list", 0], m => m.merge({ b: 3 }))

调用.updateIn()的更新程序功能时,由于{ a : 1}的原型中没有merge()方法,因此Immutable.js不会合并它,而是替换为新对象。

如果仅使用{a : 1}制作Immutable.Map,则可以解决此问题。或使用Immutable.js v4 +:显然,它使用Immutable.merge()合并纯对象,完全符合您期望的方式。

答案 1 :(得分:0)

我使用immutableJS v4.0.0-rc.12进行了测试,它可以按您的预期运行,即{ a: 1, b: 3 }。所以也许您只需要更新到该版本