Уроки18. distinctUntilChanged: убрать повторы
Уроки · 18
18. distinctUntilChanged: убрать повторы
distinctUntilChanged — без соседних дубликатов
Иногда поток выдаёт одно и то же значение подряд. Например, пользователь нажал и отпустил клавишу, но текст не поменялся. Делать новый запрос на одинаковое значение — расточительно. distinctUntilChanged() отсекает повторы.
['a', 'a', 'b', 'b', 'a'] → distinctUntilChanged()
// 'a' (новое) → пропуск → 'b' (новое) → пропуск → 'a' (опять новое)
// Результат: a, b, a
Важная деталь
Сравниваются только соседи. Значение, которое уже было раньше, но потом сменилось и снова повторилось, считается новым. Пример: a, a, b, a → a, b, a (третье a прошло, потому что предыдущим в выходе было b).
Как сравниваются значения
По умолчанию используется строгое равенство ===. Для объектов это означает сравнение по ссылке. Если нужно сравнивать по полю — есть форма distinctUntilChanged((a, b) => ...).
Что нужно сделать
- Внутри
pipeдобавьтеdistinctUntilChanged(). - Ожидаемый вывод:
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
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...