2016-09-30 5 views
0

나는 다음과 같은 클래스와 배열이버퍼 그룹화 관찰 가능한

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' } 
]; 

내가 name에 의해 소스로 HEROES 배열, 그룹 배열을 취급하고 그 관찰을 만들려면, 즉 하나의 배열로 결과를 방출해야 , 배열은 Narco, 배열은 Bombasto, 배열은 Dynama입니다.

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

을 다음과 같이 내가 관찰을 내 소스를 만들 수 있습니다

내가 할 수있는 다음에 다른 이름이 있기 때문에이 효과적으로 나에게 많은 관찰 가능한을 제공

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

즉, groupBy를 사용하여 그룹 영웅, 내 HEROES 배열 (이 경우 3 개). 그러나 이것들은 시퀀스로서 방출 될 것이고 이상적으로는 까지 buffer에 넣고 싶습니다. heroSource이 완성되었습니다. 그룹화 된 관측 대상에서 rxjs의 buffer 연산자를 사용하면 단일 컬렉션을 내보낼 수 있습니까? 모든

답변

3

먼저 사용자가 만들 수있는 최초 훨씬 간단 관찰 :

var heroSource = Observable.from(HEROES); 

다음, GROUPBY 매퍼/선택기를 생략 할 수 있습니다에 :

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

내가하는 데 필요한 원래의 문제를 해결하기 위해 그들이 시간이 0 인 버퍼가 준비 되었기 때문에 스트림을 버퍼링한다. (더 우아한 솔루션이 있어야한다.) 첫 번째 결과 만 취하기 위해서 take (1)을 사용한다. 모두 병합 :

그 배열이 실제로 정적이기 때문에 때문에, 스트림을 통해 퍼팅 후 가장 간단한 해결책이 될하지 않을 수 있습니다 매핑하는 것을 6,가
var finalGroup = groupHeroSource.map((ob) => ob.bufferWithTime(0).take(1)).mergeAll(); 

주, 당신은 단순히 그것을 줄일 수 Object.values ​​이후

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

표준이 아니므로 어레이를 얻기 위해 키를 반복해야하지만, 필요에 더 잘 맞을 수도 있습니다.