2016-04-20 9 views
1

私はChromeバージョン50でImmutable.jsドキュメントコンソールの下に次のコードをテストし、それはエラーメッセージ発する:Uncaught Error: invalid keyPath(…)Immutable.js SETIN方法でスタック

var map1 = Immutable.Map({ 
    a: 1, 
    b: { 
     c: 1 
    } 
}); 

var map2 = map1.setIn(['b', 'c'], 2); 

をそして私は、コードを変更:

var map1 = Immutable.fromJS({ 
    a: 1, 
    b: { 
     c: 1 
    } 
}); 

var map2 = map1.setIn(['b', 'c'], 2); 

ちょうどうまくいきます。しかし、なぜ? fromJSMapの違いは何ですか?

答えて

3

Map,Listおよび他の方法では、深くは不変型に変換されません。この場合、ネストされたオブジェクトbは、不変のマップmap1内のプレーンJavaScriptオブジェクトのままです。ここでは、fromJSdeeply converts the data structure into immutablesを選ぶべき理由です enter image description here

...同じを描くためにmap1のコンソール・ダンプです。 bmap1と同じタイプ(Ltとして縮小さマップ)の今であることを enter image description here

お知らせ - ここfromJS呼び出しから生成されたmap1のダンプです。

var map1 = Immutable.Map().merge({ 
    a: 1, 
    b: { 
     c: 1 
    } 
}); 

注:) merge internally invokes fromJS onlyこと -

は深い変換を行うための別の方法があります。

+0

素晴らしい回答!私はちょうどソースコード内の 'updateInDeepMap'メソッドをデバッグすることで問題を見つけました。ありがとう! – huachengzan

0

多分それは既に使用されている.MAPで、設定されたパスである、しかしそれは.fromJs

ではありませんが、設定されたパスを変更してみてください。

関連する問題