Обновить аккумулятор сканирования при передаче отфильтрованного значения - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь использовать scan для поддержки массива данных и некоторой фильтрации.

someObservable$.pipe(
   filter(initial=> initial.length !== 0),
   scan((acc, curr) => curr.filter(x => !acc.includes(x))),
   map(data => etc...)
)

Я хотел бы обновить значение cc, чтобы оно каким-то образом поддерживало полный список из всех данных, которые прошли через, но выводит только отфильтрованные значения для сопоставления. Таким образом, если первый пройденный список был [1,2,3], а второй набор был [2,3,4] На первом проходе я хочу, чтобы data был [1,2,3] и имел acc=[1,2,3], а во втором прошлом имел бы data быть [4] но есть acc=[1,2,3,4]

Я иду по этому поводу тупо? Я чувствую, что может быть лучше.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Если я угадываю ваши намерения правильно, то достаточно следующего кода:

static acc = new Set<number>();
...
return someObservable$.pipe(
  map( list => {
    let res = [];
    list.forEach( e => {
      if ( !acc.has( e ) ) {
        acc.set( e );
        res.push( e );
      }
    } );
    return res;
  } ),
  filter( list => list.length > 0 )
);
0 голосов
/ 30 апреля 2020

Я бы использовал Установить класс для аккумулятора в scan функции

Я искал в документации по rx js любую встроенную альтернативу, но не смог найти подходящую для этого дело.

Пожалуйста, посмотрите на пример.

var subject = new rxjs.Subject();

const obs = subject.pipe(
  rxjs.operators.scan((acc, current) => {current.map(pr => acc.add(pr)); return acc;}, new Set()) // 1 solution
  //rxjs.operators.scan((acc, current) => [...new Set([...acc, ...current])]) // 2 solution
  //rxjs.operators.scan((acc, current) => [...acc, ...current.filter(pr => !acc.includes(pr))]) // 3 solution - if you cant use Set
  //rxjs.operators.scan((acc, current) => acc.concat(current.filter(pr => !acc.includes(pr)))) // 4 solution - if you cant use Set and spread
);

const subscription = obs.subscribe(val => {
  console.log([...val]);
});

subject.next([1,2,3]);
subject.next([2,3,4]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.js"></script>
...