2015-10-23 4 views
27
var a = {address: {postcode: 5085}} 

var b = Immutable.fromJS(a) 
var c = b.setIn(['address', 'suburb'], 'broadview').toJS(); // no error 
console.log(c); 

var d = Immutable.Map(a); 
var e = d.setIn(['address', 'suburb'], 'broadview').toJS(); // error invalid keyPath(…) 

誰かがその違いを説明できますか。ImmutableJS Map()とfromJS()の違いは何ですか?

答えて

24

fromJS

おかげで、深い変換を行います。つまり、それはaddressは、プレーンオブジェクトではなく、ImmutableJSオブジェクトであるので、あなたはそのを変更するsetInを使用することはできません、あなたの第二の例ではなど、

をすべてのキーを再帰とリストにすべての要素を変換し、地図ます値。この例では

49

、ここ

var a = {address: {postcode: 5085}} 
var d = Immutable.Map(a); 

d.get('address')は不変あります。値は他のオブジェクトに変更できません。 ImmutableJSのImmutable.Map.set()関数を使用して既存のオブジェクトからのみ新しいオブジェクトを作成することができます。

しかし、d.get('address')すなわちによって参照オブジェクト、{postcode:5085}は、標準のJavaScriptオブジェクトです。変更可能ですです。あなたは再びdの値をチェックすると、あなたは彼値が変更されていることがわかります

d.get('address').postcode=6000; 

:このような文はpostcodeの値を変更することができます。

console.log(JSON.stringify(d)); //Outputs {"address":{"postcode":6000}} 

これは不変性の原則に反する。

理由はListMapなどのImmutableJSデータ構造がList/Mapのレベルのみ-1メンバーへの不変性機能を付与することがあります。

オブジェクト内に配列または配列内のオブジェクトがあり、それらも変更不能にしたい場合は、Immutable.fromJSです。

var a = {address: {postcode: 5085}} 
var b = Immutable.fromJS(a); 
b.get('address').postcode=6000; 
console.log(JSON.stringify(b)); //Outputs {"address":{"postcode":5085}} 

上記の例から、あなたは明らかにfromJSは、ネストされたメンバーは不変なりますどのように知ることができます。

MapfromJSの違いを理解していただければ幸いです。すべて最高=)

+1

omg、これを説明してくれてありがとう!私はこれに苦しんできました。そして、私はmap.get(k)が参照によって戻ってきた理由を理解しています(そして、なんらかの愚かなdeepCopy(map.get(k))をしないで避ける方法) – grendian

+0

Immutable.jsマップドキュメントはfromJSとのこのコアの違いを明確にしていません:https://facebook.github.io/immutable-js/docs/#/Map –

関連する問題