let observable = Observable.from([[ 'a' , 'b' , 'c' ],[ 'b', 'c' ],[ 'd' , 'c' , 'b' ]]);
我需要转换这个observable,以便它发出这三个数组的交集
最简单的方法是什么?
observable
.intersection() // Expected operator
.subscribe( letter => console.log( letter ));
out put应该是
b
c
或
c
b
答案 0 :(得分:2)
您可以将交叉算法such as this one与.reduce
-operator结合使用。
算法(归功于atk)
function intersection_destructive(a, b) {
a.sort(); <--- ADDED
b.sort(); <--- ADDED
var result = [];
while (a.length > 0 && b.length > 0) {
if (a[0] < b[0]) {
a.shift();
} else if (a[0] > b[0]) {
b.shift();
} else /* they're equal */ {
result.push(a.shift());
b.shift();
}
}
return result;
}
以及如何将其与.reduce
source
.reduce((a, b) => intersection_destructive(a, b))
.subscribe((res) => {
console.log(res);
});
这里的一个重要注意事项是,这仅适用于已排序的数组,但可以对其进行修改以适应所有目的。您还必须修改它以使用对象相等性检查,但我想这可以让您了解如何完成它。