https://facebook.github.io/immutable-js/docs/#/is
我试图比较2个OrderedMaps和Immutable.is函数不起作用。
它只能比较地图和列表吗?
比较深2 OrderedMaps有什么好方法?
let example: Immutable.OrderedMap = Immutable.OrderedMap({
'a': Immutable.Map({
rate: 1.3411,
key: 1000
}),
'c': Immutable.Map({
rate: 1.3412,
key: 1001
}),
'b': Immutable.Map({
rate: 1.3412,
key: 1002
}),
'd': Immutable.Map({
rate: 1.3410,
key: 1003
})
});
let expectedResult: Immutable.OrderedMap = example;
//adds a field to each immutable map in example
example = modifyFunction(example);
expect( Immutable.is(example, expectedResult) ).to.be.true;
function modifyFunction(example: Immutable.OrderedMap): Immutable.OrderedMap {
example.forEach((item, index) => {
item = item.set('rank', index + 1);
});
return example;
}
它一直回归真实。我需要它是假的。
答案 0 :(得分:1)
您的modifyFunction
实际上并未修改example
。每当您在ImmutableJS中修改数据结构时,它都会返回一个新对象,因此forEach
不能用于修改OrderedMap
。您正在寻找map
。
function modifyFunction(example: Immutable.OrderedMap): Immutable.OrderedMap {
return example.map((value, key) => {
return value.set('rank', key + 1);
});
}
因此,是Immutable.is
可以采用任何不可变类型,但是在修改对象时必须使用正确的函数才能看到值的变化。
答案 1 :(得分:0)
您通过将整个(内部)实例替换为具有一个额外字段的实例来向内部Immutable.Map
实例添加字段。 但是,这不会取代example
中的引用,这就是为什么严格的相等仍然适用的原因。
请考虑以下事项:
var x = { z: 5 }
var y = x;
var modifyFunction = x => {
x.z = 7; // an inner value has been modified
return x;
};
var x = modifyFunction(x); // but it's still the same reference.
console.log(y === x); // true
console.log(y.z); // 7
VS
var modifyFunction = x => {
var clone = {...x}; // completely new instance!
clone.z = 7; // clone !== x
return clone;
}
因此,除非modifyFunction
实际返回不同的实例(例如,如果要向OrderedMap
添加一个全新的条目),严格的相等性仍然是正确的。
为了安全地修改内部条目,请务必使用 ImmutableJS's OrderedMap methods for modification ,我认为您正在寻找updateIn()
。