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;
            }
        }
    });

是否有一种方法来做数组交集?

不是一个真正的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进行比较。或者如果集合很大,你可以从过滤器中创建一个对象,这样你就得到O(1) lookup:

   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]));

最新更新