2016-11-28 54 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可以採取任何不可改變的類型,但你才能看到值的變化修改對象時要使用正確的功能。

相關問題