Utilizo Pipes en Angular 2+ para filtrar matrices de objetos. A continuación se incluyen varios argumentos de filtro, pero puede enviar solo uno si se ajusta a sus necesidades. Aquí hay un ejemplo de StackBlitz . Encontrará las claves por las que desea filtrar y luego filtrará por el valor que proporcione. En realidad es bastante simple, si suena complicado no lo es, mira el ejemplo de StackBlitz .
Aquí se llama a Pipe en una directiva * ngFor,
<div *ngFor='let item of items | filtermulti: [{title:"mr"},{last:"jacobs"}]' >
Hello {{item.first}} !
</div>
Aquí está la pipa,
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filtermulti'
})
export class FiltermultiPipe implements PipeTransform {
transform(myobjects: Array<object>, args?: Array<object>): any {
if (args && Array.isArray(myobjects)) {
// copy all objects of original array into new array of objects
var returnobjects = myobjects;
// args are the compare oprators provided in the *ngFor directive
args.forEach(function (filterobj) {
let filterkey = Object.keys(filterobj)[0];
let filtervalue = filterobj[filterkey];
myobjects.forEach(function (objectToFilter) {
if (objectToFilter[filterkey] != filtervalue && filtervalue != "") {
// object didn't match a filter value so remove it from array via filter
returnobjects = returnobjects.filter(obj => obj !== objectToFilter);
}
})
});
// return new array of objects to *ngFor directive
return returnobjects;
}
}
}
Y aquí está el Componente que contiene el objeto a filtrar,
import { Component } from '@angular/core';
import { FiltermultiPipe } from './pipes/filtermulti.pipe';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
items = [{ title: "mr", first: "john", last: "jones" }
,{ title: "mr", first: "adrian", last: "jacobs" }
,{ title: "mr", first: "lou", last: "jones" }
,{ title: "ms", first: "linda", last: "hamilton" }
];
}
Ejemplo de StackBlitz
Ejemplo de GitHub: bifurca una copia de trabajo de este ejemplo aquí
*Tenga en cuenta que en una respuesta proporcionada por Gunter, Gunter afirma que las matrices ya no se usan como interfaces de filtro, pero busqué en el enlace que proporciona y no encontré nada que hablara de esa afirmación. Además, el ejemplo de StackBlitz proporcionado muestra que este código funciona según lo previsto en Angular 6.1.9. Funcionará en Angular 2+.
Happy Coding :-)