SignaturaFirma
distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare?: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T>
Parámetros
Retorna
MonoTypeOperatorFunction<T>
: Un Observable que emite elementos del Observable fuente si la propiedad especificada es distinta a la del elemento anterior.
Descripción
Si se proporciona una función de comparación, se utilizará para comprobar si cada elemento se debe emitir o no.
Si no se proporciona una función de comparación, se utiliza una verificación de igualdad.
Ejemplos
Emitir solo cuando la tecla pulsada sea distinta a la tecla pulsada anterior
Copy import { distinctUntilKeyChanged, map } from "rxjs/operators";
import { fromEvent } from "rxjs";
const key$ = fromEvent<KeyboardEvent>(document, "keydown").pipe(
distinctUntilKeyChanged("code"),
map(({ code }) => code)
);
key$.subscribe(console.log);
// Salida: (Pulsar tecla y) (Pulsar tecla x) 'KeyX'
Emitir el objeto lenguaje si su propiedad name es distinta a la del objeto anterior
Copy import { distinctUntilKeyChanged } from "rxjs/operators";
import { of } from "rxjs";
const language$ = of(
{ name: "Java", type: "Orientado a objetos" },
{ name: "Ruby", type: "Multiparadigma" },
{ name: "Ruby", type: "Multiparadigma" },
{ name: "Haskell", type: "Funcional" },
{ name: "Haskell", type: "Funcional" },
{ name: "Java", type: "Orientado a objetos" },
{ name: "Ruby", type: "Multiparadigma" }
);
language$.pipe(distinctUntilKeyChanged("name")).subscribe(console.log);
/* Salida:
{ name: "Java", type: "Orientado a objetos" },
{ name: "Ruby", type: "Multiparadigma" },
{ name: "Haskell", type: "Funcional" },
{ name: "Java", type: "Orientado a objetos" },
{ name: "Ruby", type: "Multiparadigma" }
*/
Utilizar una función de comparación para ignorar las diferencias de mayúsculas/minúsculas
Copy import { of } from "rxjs";
import { distinctUntilKeyChanged } from "rxjs/operators";
const user$ = of(
{ name: "NyaGarcía", age: 23 },
{ name: "nyagarcía", age: 23 },
{ name: "zaldih", age: 21 },
{ name: "caballerog", age: 35 },
{ name: "caballeroG", age: 35 }
);
user$
.pipe(
distinctUntilKeyChanged(
"name",
(prev, curr) => prev.toLowerCase() === curr.toLowerCase()
)
)
.subscribe(console.log);
/* Salida:
{ name: 'NyaGarcía', age: 23 },
{ name: 'zaldih', age: 21} ,
{ name: 'caballerog', age: 35 }
*/
Ejemplos de la documentación oficial
Un ejemplo comparando el campo name
Copy import { of } from "rxjs";
import { distinctUntilKeyChanged } from "rxjs/operators";
interface Person {
age: number;
name: string;
}
of<Person>(
{ age: 4, name: "Foo" },
{ age: 7, name: "Bar" },
{ age: 5, name: "Foo" },
{ age: 6, name: "Foo" }
)
.pipe(distinctUntilKeyChanged("name"))
.subscribe((x) => console.log(x));
// Salida:
// { age: 4, name: 'Foo' }
// { age: 7, name: 'Bar' }
// { age: 5, name: 'Foo' }
Un ejemplo comparando las primeras letras de la propiedad name
Copy import { of } from "rxjs";
import { distinctUntilKeyChanged } from "rxjs/operators";
interface Person {
age: number;
name: string;
}
of<Person>(
{ age: 4, name: "Foo1" },
{ age: 7, name: "Bar" },
{ age: 5, name: "Foo2" },
{ age: 6, name: "Foo3" }
)
.pipe(
distinctUntilKeyChanged(
"name",
(x: string, y: string) => x.substring(0, 3) === y.substring(0, 3)
)
)
.subscribe((x) => console.log(x));
// Salida:
// { age: 4, name: 'Foo1' }
// { age: 7, name: 'Bar' }
// { age: 5, name: 'Foo2' }
Recursos adicionales