You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:15:06