Immutable.is()可以采用任何不可变类型吗?

时间:2016-11-28 22:13:28

标签: javascript immutable.js

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;
}

它一直回归真实。我需要它是假的。

2 个答案:

答案 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()