2016-10-25 1 views
0

Avoir un flux dans lequel l'objet contient un tableau de chaînes. J'ai un filtre qui est un autre tableau de chaîne. Le filtre doit uniquement émettre les éléments dont l'intersection du tableau n'est pas vide.Rxjs/Typescript: Essayer de filtrer un flux à l'intersection d'un tableau

Ceci est le code de pseudo de ce que je veux faire.

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

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

Existe-t-il un moyen de faire une intersection de tableaux?

Répondre

0

Pas vraiment une question de Rx, mais si vous compilez en ES6, vous pouvez créer un Set à partir du filtre, puis utiliser le tableau # pour déterminer s'il y a des intersections.

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

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

Si Set n'est pas disponible, vous pouvez toujours le faire avec un Array si la comparaison est fixé petite. Ou si l'ensemble est grande, vous pouvez créer un objet hors du filtre de sorte que vous obtenez O (1) recherche:

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

Les 'bookInventoryService.getBooks()' retourne un '' Observable de sorte que le lambda 'this.books $ = '' this.bookInventoryService.getBooks() ' ' .filter (book => book.genres' ne semble pas fonctionner car il dit que 'book' est aa' book [] 'pas un individu objet 'book' ai-je besoin d'un 'foreach' sur le livre? –

+0

vous ne devriez pas avoir besoin, vous pouvez simplement aplatir le tableau de livres:' bookInventoryService.getBooks(). flatMap (books => livres) .filter (/ ** /) ' – paulpdaniels