typescript - Angular - Filtrera array av objekt med hjälp av flera valda dropdown
Jag försöker filtrera en array av objekt med hjälp av fyra fält från ett formulär. Alla fyra fält kan kombineras.
De fyra fälten är: 2 rullgardinsmenyer med flera val och 2 textfält.
När jag klickar på en knapp måste jag filtrera data baserat på de valda fälten. Detta är metoden jag anropar när jag klickar på sökknappen:
filterData(form: NgForm) {
if (this.gridValueClone) {
const filterType = form.value.selectedItemsType;
const filterCompany = form.value.selectedItemsCompany;
const filterDescription = form.value.description;
const filterNameFile = form.value.nameFile;
if (filterType.length > 0 || filterCompany.length > 0 || filterDescription || filterNameFile) {
let search;
let arrFilter = [];
if (filterType.length > 0) {
arrFilter.push({
"field": "type",
"value": filterType
});
}
if (filterCompany.length > 0) {
arrFilter.push({
"field": "company",
"value": filterCompany
});
}
if (filterDescription) {
arrFilter.push({
"field": "description",
"value": filterDescription
});
}
if (filterNameFile) {
arrFilter.push({
"field": "name",
"value": filterNameFile
});
}
const results = this.gridValueClone.filter(data=> {
arrFilter.forEach(filter => {
search = data[filter.field] === filter.value;
});
return search;
});
if (results) {
this.reportsGridValue = results;
} else {
this.reportsGridValue = [];
}
}
}
}
Som jag har det, fungerar det korrekt med filtren för textfälten (Beskrivning och Filnamn), du kan välja ett fält eller kombinera dem och filtrera bra.
Men jag vet inte hur jag ska integrera de flera urvalsfiltret (Typ och Företag), nedan kommer jag att lägga ett exempel på objektet som jag får om jag väljer alla filter som sökningen ska göras efter:
arrFilter = [
{
"field":"type",
"value":[
"Type1",
"Type2",
"Type3",
"Type4"
]
},
{
"field":"company",
"value":[
"CompanyA",
"CompanyB"
]
},
{
"field":"description",
"value":"Prueba"
},
{
"field":"name",
"value":"Prueba.txt"
}
]
Några förslag? Tack.
Svar #1
Anropa bara den korrekta logiken baserat på om filter.value är en array eller inte.
Detta borde fungera:
const results = this.gridValueClone.filter(data =>
arrFilter.every(filter =>
Array.isArray(filter.value)
? filter.value.includes(data[filter.field])
: filter.value === data[filter.field]
)
);
Din användning av forEach() i filter-callbacken är lite konstig, så jag tog bort det och ersatte det med ett anrop till every().
