2016-10-25 3 views
0

스트림에 개체에 문자열이 들어있는 스트림이 있습니다. 문자열 배열이 다른 필터가 있습니다. 필터는 배열의 교차가 비어 있지 않은 항목 만 방출해야합니다.Rxjs/Typescript : 배열 교차점에서 스트림을 필터링하려고 시도합니다.

이것은 내가하고 싶은 흉내 코드입니다.

genreFilter: string["poetry", "fiction"] 

this.books$ = this.bookInventoryService.getBooks() 
    .filter(book => { 
     for(let genre of genreFilter) { 
      if (book.genres.contains(genre) { 
       return true; 
      } 
     } 
    }); 

배열 교차를 수행 할 방법이 있습니까?

답변

0

정말 Rx 질문이 아니지만 ES6으로 컴파일하는 경우 필터에서 Set을 만든 다음 Array # some을 사용하여 교차가 있는지 확인할 수 있습니다.

const genreFilter: Set<string> = new Set(["poetry", "fiction"]); 

this.books$ = this.bookInventoryService.getBooks() 
    .filter(book => book.genres.some(genre => genreFilter.has(genre))); 

Set를 사용할 수없는 경우 설정 비교가 작은 경우는 Array 함께 할 여전히 수 있습니다.

const genreFilter = ["poetry", "fiction"] 
     .reduce((obj, key) => { 
     obj[key] = true 
     return obj; 
     }, {}); 

    this.books$ = this.bookInventoryService.getBooks() 
     .filter(book => book.genres.some(genre => genreFilter[genre])); 
+0

은'bookInventoryService.getBooks()''관찰 가능한 ' 그래서 람다 반환 세트가 큰 경우는 O (1) 조회 수 있도록 아니면 필터에서 개체를 만들 수 있습니다 'this.bookinventoryService.getBooks()''.filter (book => book.genres'는'book'이 개인이 아닌'book' [book]입니다. 'book' 객체 책에'foreach'가 필요합니까? –

+0

필요가 없습니다. 책 배열을 평평하게 놓을 수 있습니다 :'bookInventoryService.getBooks(). flatMap (books => books) .filter (/ ** /)' – paulpdaniels

관련 문제