Пропускает только уникальные значения за все время жизни потока
distinct<T, K>(
keySelector?: (value: T) => K,
flushes?: Observable<any>
): MonoTypeOperatorFunction<T>
Название | Описание |
---|---|
keySelector | Функция возвращает значение по которому будет происходить фильтрация |
flushes | Поток, next которого очищает внутренний Set в котором хранятся все предыдущие значения |
Если функция keySelector
объявлена, то в качестве значений для фильтрации будет использоваться то что возвращает эта функция, иначе фильтроваться будут сами значения.
Для повышения производительности работы фильтрации используется Set
. В случае если он не поддерживается используется массив в связке с indexOf
, что несколько медленнее, чем Set. Но даже в современных браузерах, долгое использование этого оператора может привести к утечкам памяти. Чтобы избежать этого вы можете использовать flushes
, для очистки Set-а.
// RxJS v6+
import { of } from 'rxjs';
import { distinct } from 'rxjs/operators';
of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1).pipe(
distinct(),
)
.subscribe(x => console.log(x)); // 1, 2, 3, 4
import { of } from 'rxjs';
import { distinct } from 'rxjs/operators';
interface Person {
age: number,
name: string
}
of<Person>(
{ age: 4, name: 'Foo'},
{ age: 7, name: 'Bar'},
{ age: 5, name: 'Foo'},
).pipe(
distinct((p: Person) => p.name),
)
.subscribe(x => console.log(x));
// displays:
// { age: 4, name: 'Foo' }
// { age: 7, name: 'Bar' }
- 📰 Официальная документация: dictinct
- 📁 Исходный код: https://github.com/reactivex/rxjs/tree/6.5.5/src/internal/operators/distinct.ts