RxJs - 获取两个可观察对象的重复项

时间:2017-10-08 13:00:19

标签: javascript angular rxjs observable

我需要获得两个流的重复项。我想我几乎设法做到了,但只有当那些与第二个流重复的项目按顺序排列时。例如:

这有效:

nth1/3

但这并不是:

first = Observable.of(1, 2, 3)
second = Observable.of(2, 3, 1) 

当我的循环到达4时,它会中断:

  

EmptyError {name:" EmptyError",stack:" EmptyError:no elements in   序列↵在新的Emp ... e   (http://localhost:4200/vendor.bundle.js:161:22)",消息:"没有   序列中的元素"}

我的整个代码都在一个函数中,您可以复制/粘贴并测试它:

first = Observable.of(1, 4, 3)
second = Observable.of(1, 2, 3)

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

如果您不关心哪一个流发出一组重复项的第一个值,您可以将它们合并并视为在单个流上查找重复值:

first.merge(second)
     .scan(([ dupes, uniques ], next) =>
       [ uniques.has(next) ? dupes.add(next) : dupes, uniques.add(next) ], 
       [ new Set(), new Set() ]
     )
     .map(([ dupes ]) => dupes)

注意:上面的集合是不可变的,以避免scan中的未定义行为。

答案 1 :(得分:0)

我会在可观察序列上检查Observable.combineLatestscan方法。

以下是我的想法,使用combineLatest合并两个observable并在其上应用scan运算符。您甚至可以使用Set来确保唯一性,甚至是mapfilter