用RXJS取到N个相同的数字吗?

时间:2018-09-12 13:13:34

标签: javascript rxjs

我有以一定速率发出值的代码:

let source = zip (
             interval(150) ,
              from ([0,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]) 
            )  .subscribe(a=>console.log(a))

我想找到一个值-确定了N个值之后(这意味着-N个重复的相同值)。

例如,如果N=5,那么我需要找到它第一次产生5个相同的值。 (并发出该值。)

问题:

如何检测N个相同的值并发出该值(并完成流)?

所以这里的期望值为3,因为它是5个相同值的第一个序列:

enter image description here

Online demo

2 个答案:

答案 0 :(得分:5)

您可以使用StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); timestamp = jsonObject.getLong("time"); lastLoadedDate = new Date(timestamp); } catch (JSONException e) { //Handle the exception } } } ,其中bufferCount(N, 1)告诉1在每次发射之后都要发射其缓冲区,这意味着它将发射bufferCount个项目的数组。然后只需检查它们是否相同且完整即可。

N

实时演示:https://stackblitz.com/edit/rxjs6-demo-xzb5so?file=index.ts

答案 1 :(得分:1)

这有点丑陋,但这会起作用

from([0,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]).pipe(
   scan((acc, cur) => {
     if (cur !== acc.lastValue) {
       acc.count = 0;
       acc.lastValue = cur;
     } else {
       acc.count++;
       acc.lastValue = cur;
       if (acc.count >= acc.nValues) {
         acc.found = true;
       }
     }
     return acc;
   },
   {
      count: 0,
      lastValue: undefined,
      nValues: 5,
      found: false
   }),
   filter(result => result.found),
   map(result => result.lastValue),
   take(1)
).subscribe(console.log)