BACK
Уроки18. distinctUntilChanged: убрать повторы
Уроки · 18

18. distinctUntilChanged: убрать повторы

distinctUntilChanged — без соседних дубликатов

Иногда поток выдаёт одно и то же значение подряд. Например, пользователь нажал и отпустил клавишу, но текст не поменялся. Делать новый запрос на одинаковое значение — расточительно. distinctUntilChanged() отсекает повторы.

['a', 'a', 'b', 'b', 'a'] → distinctUntilChanged()
// 'a' (новое) → пропуск → 'b' (новое) → пропуск → 'a' (опять новое)
// Результат: a, b, a

Важная деталь

Сравниваются только соседи. Значение, которое уже было раньше, но потом сменилось и снова повторилось, считается новым. Пример: a, a, b, aa, b, a (третье a прошло, потому что предыдущим в выходе было b).

Как сравниваются значения

По умолчанию используется строгое равенство ===. Для объектов это означает сравнение по ссылке. Если нужно сравнивать по полю — есть форма distinctUntilChanged((a, b) => ...).

Что нужно сделать

  1. Внутри pipe добавьте distinctUntilChanged().
  2. Ожидаемый вывод: Query: ng → Query: rxjs → Query: ng. Соседние повторы выпали.
Решение spoiler · click to reveal
const { from, distinctUntilChanged } = Rx;

const query$ = from(['ng', 'ng', 'rxjs', 'rxjs', 'ng']).pipe(
  distinctUntilChanged()
);

query$.subscribe(value => {
  console.log('Query: ' + value);
});
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...