2017-04-10 3 views
2

トリプルのようなオブジェクトを生成するサービスがあります。彼らは、この形式になります。トリプルからアトリビュートをテーブルに結合するRxJS

{ country, attribute, value } 

例:

{ country: 'usa', attribute: 'population', value: 100 } 
{ country: 'mexico', attribute: 'population', value: 200 } 
{ country: 'usa', attribute: 'areaInSqM', value: 3000 } 

最終的に私はテーブルとしてこれらを表示したいです。行は国、列は属性です。だから、表は次のようになります。

| country | population | areaInSqM | 
| usa  | 100  | 3000  | 
| mexico | 200  |   | 

私の仮定は、(おそらく間違っている)私は行の配列である中間データ構造を作成する必要があるということです。以下のような:

[ { country: 'usa', population: 100, areaInSqM: 3000 }, .... ] 

私の現在のソリューションは国によってインデックス付けたルックアップオブジェクトを格納し、私はそれぞれの属性タイプを含むセットを格納するオブジェクトの非RxJSの混乱で、バックで上記の配列への参照オブジェクトを変換終わり。私が避けたいと思うループと二重の記憶がたくさんあります。

RxJSには、この種の操作を支援する演算子がありますか?

スマートな方法がありますか?この特定のケースで

、仮定は以下のとおりです。

  • 属性は値が常に与えられた「セル」はnullにすることができ
  • 数値であらかじめ
  • の知られていません。この例では、メキシコareaInSqMが提供されることはありません

編集:ソリューションと Plunkr:https://plnkr.co/edit/FVoeVmmzMN7JGJ3zWFQM?p=preview

答えて

2

2つのあなたの質問、データ構造の一部のコンポーネント、およびデータフローの部分(私はあなたを想定があります。これらのデータを1つずつストリームとして取得します(Rxjを使用する理由)。

データ構造を繰り返し作成する簡単な方法は、scan演算子を使用することです。例えば:

のdataSource $は形状 { country, attribute, value }のオブジェクトを生成することを仮定します
myDataStructure$ = dataSource$.scan(function (accDataStructure, triple){ 
    accDataStructure[triple.country] = accDataStructure[triple.country] || {} 
    accDataStructure[triple.country][triple.attribute] = accDataStructure[triple.country][triple.attribute] || {} 
    accDataStructure[triple.country][triple.attribute] = triple.value 
    return accDataStructure 
}, {}) 

。次に、myDataStructure$は、すべての着信データに対して、探している反復的に構築されたデータ構造を出力します。構築が完了したらそのデータ構造だけが必要な場合は、.last()myDataStructure$に追加してください。

これはテストされていませんので、それが動作するかどうか教えてください

+0

中間作成が機能します。テーブルを作成するために、すべての行をループするか、列を保存する必要がある場合は、より多くのコードが必要ですが、それは問題ありません。 – cmonkey

関連する問題