有一个流,其中对象包含字符串数组。我有一个过滤器,这是另一个字符串数组。过滤器应该只发出数组交集不为空的项目。
这是我想要做的伪代码。
genreFilter: string["poetry", "fiction"]
this.books$ = this.bookInventoryService.getBooks()
.filter(book => {
for( let genre of genreFilter) {
if (book.genres.contains(genre) {
return true;
}
}
});
有没有办法进行阵列交叉?
答案 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]));