有一个流,其中的对象包含一个字符串数组。我有一个过滤器,它是另一个字符串数组。过滤器应该只输出那些数组的交点不为空的项。
这是我想要做的伪代码。
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]));