Оператор карты возвращает целое число в качестве вывода с массивом в качестве ввода

Это пример кода из документов. Я новичок в RXJS, так что это может быть очень легко.

Может кто-нибудь объяснить, как оператор карты возвращает однозначное целое число после работы с массивом?

Я проверил, что возвращаемое значение оператора сканирования является массивом, который увеличивается с [0], [0,1], [0,1,2], [0,1,2,3] .... и так далее.

// RxJS v6+
import { interval } from 'rxjs';
import { scan, map, distinctUntilChanged } from 'rxjs/operators';

// Accumulate values in an array, emit random values from this array.
const scanObs = interval(1000)
  .pipe(
    scan((a, c) => [...a, c], []),
    map(r => r[Math.floor(Math.random() * r.length)]),
    distinctUntilChanged()
  )
  .subscribe(console.log);

1 ответ

Интервал генерирует увеличивающееся целое число каждую секунду, сканирование добавляет это целое число к массиву, а затем карта вытаскивает случайный элемент этого массива, и DifferentUntilChanged останавливает его выдачу одного и того же числа дважды в строке. Намного более эффективный способ получить случайное число, при котором максимально возможное число увеличивается на единицу каждый раз, был бы намного более эффективным с

const { interval } = rxjs;
const { map, distinctUntilChanged } = rxjs.operators;

interval(1000).pipe(
  map(i => Math.ceil(Math.random() * i)),
  distinctUntilChanged()
).subscribe(val => { console.log(val); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>

Нет необходимости хранить все предыдущие значения в массиве.

Другие вопросы по тегам