如何对RxJS中pairwise输出的流应用filter过滤逻辑?
问题原因
- 语法错误:你编写的
map操作符语句缺少闭合的右括号,代码本身语法不合法,无法正常执行。 - 触发逻辑不符合预期:RxJS的
pairwise操作符要求上游的this.selectedObjectsIds$至少发射2次值之后,才会第一次输出成对的前后值,如果你的业务场景中this.selectedObjectsIds$仅发射过1次值,该流不会产生任何输出,看起来就像逻辑未生效。 - 性能缺陷:直接调用
Array.includes做存在性判断的时间复杂度为O(n),如果ID数组长度较大,执行效率较低。
修正方案
修复语法问题的同时,可将后一次的ID数组转换为Set优化判断效率,也可以通过数组解构提升代码可读性,修正后代码如下:
this.unselectedObjectsIds$ = this.selectedObjectsIds$.pipe( pairwise(), map(([prevIds, currIds]) => { const currIdSet = new Set(currIds); return prevIds.filter(id => !currIdSet.has(id)); }) );
如果你需要this.selectedObjectsIds$第一次发射值时就计算出未选中ID,可以搭配startWith操作符设置初始值,示例如下:
this.unselectedObjectsIds$ = this.selectedObjectsIds$.pipe( startWith([]), // 初始值设为空数组,第一次发射即可凑成对值触发计算 pairwise(), map(([prevIds, currIds]) => { const currIdSet = new Set(currIds); return prevIds.filter(id => !currIdSet.has(id)); }) );
内容的提问来源于stack exchange,提问作者user16382159
相关产品推荐
相关产品推荐

