获取单个observable发出的数组的交集

时间:2017-12-15 11:18:33

标签: rxjs observable

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

1 个答案:

答案 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);
  });

这里的一个重要注意事项是,这仅适用于已排序的数组,但可以对其进行修改以适应所有目的。您还必须修改它以使用对象相等性检查,但我想这可以让您了解如何完成它。

Working jsFiddle here