distinctUntilChanged
function stable operator
Возвращает результат Observable, который излучает все значения, отправленные исходным наблюдаемым, если они отличаются от последнего значения, излученного наблюдаемым результатом.
distinctUntilChanged(comparator?: (previous: T, current: T) => boolean): MonoTypeOperatorFunction<T>
Параметры
comparator |
(previous: T, current: T) => boolean |
Необязательно. По умолчанию |
Возвращает
distinctUntilChanged(comparator: (previous: K, current: K) => boolean, keySelector: (value: T) => K): MonoTypeOperatorFunction<T>
Параметры
comparator |
(previous: K, current: K) => boolean |
|
keySelector |
(value: T) => K |
Возвращает
Описание
Без параметров или с первым параметром (comparator) ведет себя следующим образом:
- Всегда излучает первое значение из источника.
- Для всех последующих значений, отправленных источником, они сравниваются с ранее излученными значениями с использованием предоставленного
comparatorили проверки на равенство===. - Если значение, отправленное источником, определяется как неравное по этой проверке, это значение излучается и становится новым «ранее излученным значением» внутри.
При предоставлении второго параметра (keySelector) поведение меняется:
- Всегда излучает первое значение из источника.
keySelectorбудет выполняться для всех значений, включая первое.- Для всех значений после первого, выбранный ключ сравнивается с ключом, выбранным из ранее излученного значения, с использованием
comparator. - Если ключи определяются как неравные по этой проверке, излучается значение (а не ключ), и выбранный ключ из этого значения сохраняется для будущих сравнений с другими ключами.
Примеры
Очень простой пример без comparator. Обратите внимание, что 1 излучается более одного раза, потому что он отличается от предыдущего излученного значения, а не от всех других излученных значений.
import { of, distinctUntilChanged } from 'rxjs';
of(1, 1, 1, 2, 2, 2, 1, 1, 3, 3)
.pipe(distinctUntilChanged())
.subscribe(console.log);
// Logs: 1, 2, 1, 3
С comparator, вы можете выполнять пользовательские сравнения. Предположим, вы хотите излучать значение только тогда, когда все его компоненты изменились:
import { of, distinctUntilChanged } from 'rxjs';
const totallyDifferentBuilds$ = of(
{ engineVersion: '1.1.0', transmissionVersion: '1.2.0' },
{ engineVersion: '1.1.0', transmissionVersion: '1.4.0' },
{ engineVersion: '1.3.0', transmissionVersion: '1.4.0' },
{ engineVersion: '1.3.0', transmissionVersion: '1.5.0' },
{ engineVersion: '2.0.0', transmissionVersion: '1.5.0' }
).pipe(
distinctUntilChanged((prev, curr) => {
return (
prev.engineVersion === curr.engineVersion ||
prev.transmissionVersion === curr.transmissionVersion
);
})
);
totallyDifferentBuilds$.subscribe(console.log);
// Logs:
// { engineVersion: '1.1.0', transmissionVersion: '1.2.0' }
// { engineVersion: '1.3.0', transmissionVersion: '1.4.0' }
// { engineVersion: '2.0.0', transmissionVersion: '1.5.0' }
Вы также можете предоставить пользовательскую comparator для проверки того, что измененные события излучаются только в одном направлении. Предположим, вы хотите получить только следующую температуру записи:
import { of, distinctUntilChanged } from 'rxjs';
const temps$ = of(30, 31, 20, 34, 33, 29, 35, 20);
const recordHighs$ = temps$.pipe(
distinctUntilChanged((prevHigh, temp) => {
// If the current temp is less than
// or the same as the previous record,
// the record hasn't changed.
return temp <= prevHigh;
})
);
recordHighs$.subscribe(console.log);
// Logs: 30, 31, 34, 35
Выбор событий обновления только тогда, когда поле updatedBy показывает, что собственник счета изменился.
import { of, distinctUntilChanged } from 'rxjs';
// A stream of updates to a given account
const accountUpdates$ = of(
{ updatedBy: 'blesh', data: [] },
{ updatedBy: 'blesh', data: [] },
{ updatedBy: 'ncjamieson', data: [] },
{ updatedBy: 'ncjamieson', data: [] },
{ updatedBy: 'blesh', data: [] }
);
// We only want the events where it changed hands
const changedHands$ = accountUpdates$.pipe(
distinctUntilChanged(undefined, update => update.updatedBy)
);
changedHands$.subscribe(console.log);
// Logs:
// { updatedBy: 'blesh', data: Array[0] }
// { updatedBy: 'ncjamieson', data: Array[0] }
// { updatedBy: 'blesh', data: Array[0] }
См. также
© 2015–2022 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors.
Code licensed under an Apache-2.0 License. Documentation licensed under CC BY 4.0.
https://rxjs.dev/api/operators/distinctUntilChanged