2016-11-28 6 views
0

https://facebook.github.io/immutable-js/docs/#/isImmutable.is()はImmutable型を使用できますか?

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

['OrderedMap#equals'](https://facebook.github.io/immutable-js/docs/#/OrderedMap/equals)は、その実装に' Immutable.is'を使用すると主張しています。それがうまくいかない理由を見てください。あなたは[mcve]を提供してもらえますか? – 4castle

+0

'example'を変更した場合、' expectedResult'と等しくなりません。 'false'は正しい出力です。 – 4castle

+0

それは私のためにfalseを返すことはありません。 – user1261710

答えて

0

Immutable.Mapインスタンスにフィールドを追加するには、(インナー)インスタンス全体を1つのフィールドを余分に持つインスタンスに置き換えます。 しかしは、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 

のでmodifyFunctionない限り、実際には別のインスタンスを返します

var modifyFunction = x => { 
    var clone = {...x}; // completely new instance! 
    clone.z = 7; // clone !== x 
    return clone; 
} 

対(たとえば、あなたが OrderedMapに完全に新しいエントリを追加した場合)、厳密:

は、次の点を考慮します平等は依然として真実です。

安全ImmutableJS's OrderedMap methods for modificationを使用してください、内側のエントリを変更するために、私はあなたがupdateIn()を探していると思います。

+0

ImmutableJS構造体は、変更されたときに常に別のインスタンスを返します。 (それは彼らが不変のままでいる方法です)。私は彼らの 'modifyFunction'がマップを変更していないと思います。 – 4castle

+0

@ 4castleインスタンスを '='でサイレントに置き換えたときには、魔法を動作させるためにImmutableJSの修正メソッドを使う必要があります。具体的に言えば、彼は '.forEach'を使用してマップを反復しています。これは副作用のために明示的に使用されているため、マップの変更には適していません。 –

1

modifyFunctionは実際にはexampleを変更しません。 ImmutableJS内のデータ構造を変更すると、いつでも新しいオブジェクトが返されるので、forEachOrderedMapの変更には使用できません。あなたはmapを探しています。

function modifyFunction(example: Immutable.OrderedMap): Immutable.OrderedMap { 
    return example.map((value, key) => { 
    return value.set('rank', key + 1); 
    }); 
} 

そこで、イエスImmutable.isはあらゆる不変のタイプを取ることができますが、値の変化を確認するために、オブジェクトを変更するときに、正しい機能を使用する必要があります。

関連する問題