2016-11-28 56 views
0

https://facebook.github.io/immutable-js/docs/#/isCan Immutable.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; 
} 

它继续返回true。我需要它是错误的。

+0

['OrderedMap#equals'(https://facebook.github.io/immutable-js/docs/#/OrderedMap/equals)声称使用'Immutable.is'其实施,所以不看看为什么它不起作用。你能提供一个[mcve]吗? – 4castle

+0

如果修改'example',它将不再等于'expectedResult'。 “false”是正确的输出。 – 4castle

+0

它从未为我回报过假。 – user1261710

回答

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

+0

ImmutableJS结构在修改时总是返回不同的实例。 (这是他们如何保持不变)。我认为他们的'modifyFunction'不会修改地图。 – 4castle

+0

@ 4castle不是当你用'='无声地替换实例时,你需要使用ImmutableJS的修改方法来使魔法生效。具体而言,他使用'.forEach'来迭代地图,这是明确用于副作用,因此不适合修改地图。 –

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可以采取任何不可改变的类型,但你才能看到值的变化修改对象时要使用正确的功能。

相关问题