我确定我以某种方式做错了,但是我正在尝试使用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



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

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也得到了类似的结果,所以我认为有些明显的东西我没看到。
如何按值比较列表中的项目?

最佳答案

在进行对象相等性比较之前,您需要将对象转换为Immutable collection

您还需要使用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>

关于javascript - Immutable.js不按值比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59727875/

10-10 22:08