首页 > 解决方案 > Immutable.js 不按值比较

问题描述

我确定我在某种程度上做错了,但我正在尝试使用 Immutable.js 进行函数式编程,并且在按值比较对象时遇到了麻烦。在文档中, Set 数据结构使用 Immutable.is 进行相等性和包含性测试,并且 Immutable.is 的页面状态

Value equality check with semantics similar to Object.is, but treats Immutable Collections as values, equal if the second Collection includes equivalent values

但是,当我在 Firefox 的调试器上测试此行为时,我得到以下结果:

let x = {a:1}
let y = {a:1}
is(x,y) //False
is({a:1},{a:1}) //False
Set.of({a:1}).includes({a:1}) //False

然后我想也许我必须使用不可变的映射而不是对象文字,但我仍然得到以下内容:

let x = Map({a:1})
let y = Set(Map({a:1}))
y.includes(x) //False

let x = []
x.push(Map({a:1}))
x.includes(Map({a:1})) //False

我也使用来自 Lodash 的 .includes 获得了类似的结果,所以我想有一些明显的东西我只是没有看到。如何按值比较列表中的项目?

标签: javascriptimmutable.js

解决方案


在进行对象相等比较之前,您需要将您的对象转换为不可变集合

您还需要使用Immutable.is()方法进行相等比较。

const x = {a:1}
const y = {a:1}
const xImmutable = Immutable.Map(x)
const yImmutable = Immutable.Map(y)
console.log(Immutable.is(x, y)) //false
console.log(x === y) //false
console.log(Immutable.is(xImmutable, yImmutable)) //true
console.log(xImmutable === yImmutable) //false
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.min.js"></script>


推荐阅读