2016-09-30 2 views
0

私は、ソースとしてHEROES配列を扱うnameことでグループの配列を単一のアレイ、すなわちその結果を発すること、観察を作成する以下のクラスと配列バッファグループ化された観測

class Hero { 
    id: number; 
    name: string; 
} 

const HEROES: Hero[] = [ 
    { id: 11, name: 'Narco' }, 
    { id: 12, name: 'Narco' }, 
    { id: 13, name: 'Bombasto' }, 
    { id: 14, name: 'Bombasto' }, 
    { id: 15, name: 'Bombasto' }, 
    { id: 16, name: 'Dynama' }, 
    { id: 17, name: 'Dynama' }, 
    { id: 18, name: 'Dynama' }, 
    { id: 19, name: 'Dynama' }, 
    { id: 20, name: 'Dynama' } 
]; 

を持っています私はの1つ、Bombastoの1つ、Dynamaの1つの3つの配列で終わるはずです。

で異なる名前があるので、私はその後、これが効果的に多くの観測として私を、すなわち、groupByを使用して、グループのヒーロー、

var groupHeroSource = heroSource 
      .groupBy((hero: Hero) => {return hero.name}); 

を与えることができ

var heroSource = Observable.create((observer:any) => { 
      HEROES.forEach((hero: Hero) => { 
       observer.next(hero); 
      }) 
     }); 

を次のように私が観察私のソースを作成することができます私のHEROES配列(ここでは3つ)。しかし、これらはシーケンスとして放出され、理想的には私はbufferheroSourceまで完成させたいと思います。グループ化されたオブザーバブルでrxjsのbuffer演算子を使用すると、単一のコレクションを生成できますか?

答えて

3

あなたがはるかに簡単にあなたの初期に観察を作成することができますまず第一に:私は必要な元の問題を解決するために

var groupHeroSource = heroSource.groupBy((hero: Hero): string => hero.name); 

var heroSource = Observable.from(HEROES); 

次に、あなたのGROUPBYマッパー/セレクタはと省略することができます彼らは準備が整っているので、時間が0のバッファは準備ができているので、最初の結果だけを取るためにtake(1)を使う(繰り返しバッファを避ける)すべてをマージする:

var finalGroup = groupHeroSource.map((ob) => ob.bufferWithTime(0).take(1)).mergeAll(); 

そのため、あなたの配列が実際に静的であるため、ことに注意してください、ストリームを介してそれを置き、それが最も簡単な解決策ではないかもしれないマッピングし、あなたは単にそれを減らすことができます

var grouped = HEROES.reduce((acc: any, hero: Hero) => { 
    acc[hero.name] = acc[hero.name] || []; 
    acc[hero.name].push(hero); 
    return acc; 
}, {}); 

Object.valuesので、標準ではありませんが、配列を取得するためにキーを繰り返し処理する必要がありますが、それはあなたのニーズに適しているかもしれません。

関連する問題