2017-11-15 8 views
0

可能な重複:Reduxのストア不変JSOrderedMapでの作業 Add an Item in OrderedMap with Immutable.jsOrderedMapの最後のエントリとしてキー値のペアを追加する方法..?

Reduxのストアの構造:

{ 
    "app": { 
     "name": "Test app", 
     "dataPack":{ 
      "chemID": "aaaa", 
      "item": { 
      "yp57m359": { 
      "solid": 33, 
      "liquid": 45, 
      "gas": 65 
      }, 
      "h58wme1y": { 
      "solid": 87, 
      "liquid": 9, 
      "gas": 30 
      }, 
      "dff56fhh": { 
      "solid": 76, 
      "liquid": 43, 
      "gas": 77 
      } 
     } 
     } 
    } 
    } 

減速コード:action.item_idはランダムID(すべてのアイテムのキー)である

​​

上記のコードは、項目を追加するために完全に機能します。

問題は:ランダムな位置に格納されているアイテム。私は追加している注文を維持する必要があります。 最後のエントリitemのようにすべてのアイテムを追加する必要があります。 1つ1つのアイテムを追加することは、同じ順序ではありません。

この問題を解決するお手伝いをしてください。

+0

あなたは['List'](https://facebook.github.io/immutable-js/docs/#/List/List)を使用できませんか? – Icepickle

+0

私の店舗構造に示されているように、 'List'に配列インデックスなしでキー値のペアを追加することは可能ですか? – ArunValaven

+0

いいえ、どの言語でサポートしていますか?なぜあなたのリストの項目としてkeyvalueペアを追加しないのですか? – Icepickle

答えて

0

OrderedMapは、物事を入れた順序を覚えています。 OrderedMapに新しいkeyという.set(key, value)と呼ぶたびに、最後に追加されます。

let state = Immutable.Map({ 
 
    "app": Immutable.Map({ 
 
    "name": "Test App", 
 
    "dataPack": Immutable.Map({ 
 
     "chemId": "aaaa", 
 
     "items": Immutable.OrderedMap({}) // this is the thing we want ordered 
 
    }) 
 
    }) 
 
}); 
 

 
state = state.setIn(['app', 'dataPack', 'items', 'yp57m359'], Immutable.Map({ 
 
    'first': 'item' 
 
})); 
 
state = state.setIn(['app', 'dataPack', 'items', 'h58wme1y'], Immutable.Map({ 
 
    'second': 'item' 
 
})); 
 
state = state.setIn(['app', 'dataPack', 'items', 'dff56fhh'], Immutable.Map({ 
 
    'third': 'item' 
 
})); 
 

 

 
console.log(state.toJS()); // notice things are in order
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>

私たちは、あなたがあなたのストアを作成した方法を見ることができないので、それはあなたの問題がある場所を正確に伝えるのは難しいのですが、私の推測では、"item"Mapの代わりに、定期的に古いを指しているということでしょうOrderedMapfromJS(data)を使用して状態を作成する場合は、デフォルトでOrderedMapの代わりにMapを使用します。

+0

はい、あなたは正しいです。私がそれをコンソールにしたときに '(地図)'として表示されている( 'items'キー)。 **以下は、OrderedMapとして全体の状態を設定するために使用した 'Reducer'コードです。** 'immutable'からの' import {OrderedMap、fromJS}; エクスポートデフォルト機能myApp(状態=新規OrderedMap、アクション){ switch(action.type){ case 'ADD_DATA': return fromJS({app:action.data.app}); ケース 'TEST_DATA': console.log(state); } } ' 「マップ」として表示されていますが、 'item'キーをOrderedMapとして設定する方法を教えてもらえますか? – ArunValaven