在将 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 }
最佳答案
Immutable.js 不应该合并这样的普通对象(无论如何在 v4 之前)。
state.mergeIn(["list", 0], { b: 3 })
相当于
state.updateIn(["list", 0], m => m.merge({ b: 3 }))
当调用.updateIn()
的更新函数时,由于{ a : 1}
中没有merge()
方法原型(prototype),Immutable.js 不会合并它,而是替换为新对象。
如果您只是用 {a : 1}
制作一个 Immutable.Map,就可以解决这个问题。或者使用 Immutable.js v4+:显然,它使用 Immutable.merge()
合并普通对象,完全按照您期望的方式工作。
关于immutable.js - 不可变的 mergeIn 会覆盖原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54490825/