Rxjs / Typescript:尝试在数组交集

时间:2016-10-25 22:31:23

标签: rxjs observable typescript2.0

有一个流,其中对象包含字符串数组。我有一个过滤器,这是另一个字符串数组。过滤器应该只发出数组交集不为空的项目。

这是我想要做的伪代码。

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

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

有没有办法进行阵列交叉?

1 个答案:

答案 0 :(得分:1)

不是真正的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)查找:

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