immutable.js - 不可变的 mergeIn 会覆盖原始值

标签 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 }

最佳答案

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/

相关文章:

javascript - 如何读取不可变列表中的不可变记录?

javascript - 应该使用 `.merge()` 或多个 `.set()` 来更新 ImmutableJS 中的多个字段吗?

javascript - 在 Immutable.js 中深入查找

javascript - react Redux : Using Immutable in Reduce State

javascript - Immutable.js 比较是如何工作的?

javascript - 为 React Component Props 解构 ImmutableJS Map

javascript - react +助焊剂。优化将存储状态传递给组件的过程

reactjs - React、Redux 和不可变

javascript - 保持 Immutable JS Map 的顺序

javascript - 将包装函数应用于导入的函数