在rxjs中选择重复的第一项

时间:2017-06-05 20:51:12

标签: javascript sockets filter merge rxjs

我从socket接收了一堆流,并希望将重复的流合并到一个流中(或选择第一个项)

总之,我想通过rxjs执行此操作:

In:  1 - 1 - 1 - 2 - 2 - 3 - 3 - 1 - 1 - 1 - 2 - 2 - 2 - 1 - 2 - 2 - 3 - 3
Out: 1 - - - - - 2 - - - 3 - - - 1 - - - - - 2 - - - - - 1 - 2 - - - 3 - -

3 个答案:

答案 0 :(得分:3)

distinctUntilChanged完全符合您的需要。

答案 1 :(得分:0)

你可以试试这个

var arr = [1,1,1,2,2,3,3,1,1,1,2,2,2,2,1,2,2,3,3];
for (i = 1; i < arr.length; i++) { 
    if (arr[i]==arr[i-1]){ arr.splice(i,1);i--;}
}

OUT:[1, 2, 3, 1, 2, 1, 2, 3]

答案 2 :(得分:0)

以下是使用Array.fitler()函数的方法:

[1,1,1,2,2,3,3,1,1,1,2,2,2,2,1,2,2,3,3].filter((value, index, src) => {
  if(index === 0) {
    //The first element of the array is always included
    return true;
  }
  // Return true (keep) if the current element `value` is different
  // than the element that was last encountered (`src[index-1]`)
  return src[index-1] !== value;
});

输出到:

[ 1, 2, 3, 1, 2, 1, 2, 3 ]

这是通过迭代数组并检查每个元素是否与它之前的on相同或不同来实现的。这是同样的事情,但作为一个班轮:

[1,1,1,2,2,3,3,1,1,1,2,2,2,2,1,2,2,3,3].filter((value, index, src) => {
  return index === 0 || src[index-1] !== value;
});