2016-09-02 6 views
0

reduxとimmutablejsを使用していますが、私は縮小機能を作成しようとしています。私はここで不変のJS - mergeは、配列からマップオブジェクトのリストを作成します

const a = new Immutable.Map({ 
    numbers: [{id: 1},{id: 2}] 
}); 

const b = a.merge(
    { 
    numbers: [{id: 4},{id: 5}] 
    } 
); 

を期待していなかったいくつかの行動に遭遇している

は、私はnumbersは、Mapオブジェクトの不変のリストであることを期待していなかったab

a.get("numbers"); 
[Object, Object] 
b.get("numbers"); 
List {size: 2, _origin: 0, _capacity: 2, _level: 5, _root: null…} 
b.get("numbers").get(0); 
Map {size: 1, _root: ArrayMapNode, __ownerID: undefined, __hash: undefined, __altered: false} 

の値です。私のアプリケーションで

、Reduxのを使用して、私は初期状態を設定します。

const initialState = new Immutable.Map({ 
    error: null, 
    isBusy: false, 
    films: [] 
}); 

私は減速、私は映画をフェッチするとき、私は次のようにそれらをマージしよう:

return state.merge({ 
     isBusy: false, 
     films: action.payload, 
     error: null 
     }); 

この原因filmsのような反応コンポーネントの問題は、最初はオブジェクトの配列であり、不変のマップのリストになります。

異なる初期状態を作成するか、別の種類のマージを使用する必要がありますか?または、他の何か?私はあなたがやろうとしているものだと思い

おかげ

答えて

1

は、少なくともあなたが言う場合にはすべきではない、それは更新 +(連結またはマージする必要があり、全体マップオブジェクトのマージされていません):

const a = new Immutable.Map({ 
    numbers: [{id: 1},{id: 2}] 
}); 

const b = a.update("numbers", numbers => 
    numbers.concat([{id: 4},{id: 5}]) 
    // or 
    numbers.merge([{id: 4},{id: 5}]) 
); 

あなたのコードにマージ行うことで、あなたは鍵がマージで同じであるため、「マージ」の性質のために、既存のものを上書きしています。 "数字"

+0

数字を上書きすることが欲しいですが、それは問題ではありません。問題は、フィルムは最初はオブジェクトの配列であり、マージ後に不変のマップのリストになります。どのようにオブジェクトの配列として保持することができますか? – Daryn

+0

これがトップのマップを使用している理由です。マップは内部オブジェクトをマップに変換しません。これを行うには、オブジェクトをマップに深く変換するI.fromJS()を使用し、リストに配列 – erdysson

+0

を使用してください。プレーンな配列やオブジェクトを保持しながらそれらをマージすることは可能ですか? – Daryn

関連する問題