javascript - Optionales Chaining in Kombination mit toLowerCase und indexOf während Array map
Für ein Autocomplete-Eingabefeld suche ich während der Eingabe in den Projekteigenschaften. Jetzt möchte ich diesen Code verbessern
filterProjects(value: string) {
return this.projects.filter(
project =>
project.key.toLowerCase().indexOf(value.toLowerCase().trim()) >=
0 ||
project.name.toLowerCase().indexOf(value.toLowerCase().trim()) >=
0 ||
project.description?.toLowerCase().indexOf(value.toLowerCase().trim()) >=
0
);
}
mit diesem:
filterProjects(value: string) {
return this.projects.filter(project =>
[project.key, project.name, project.description].map(
str => str?.toLowerCase().indexOf(value.toLowerCase().trim()) >= 0
)
);
}
Ich verwende die optionale Verkettung, weil description null oder undefined sein kann.
Aber es funktioniert nicht, das bedeutet, dass die Funktion das Array immer unverändert zurückgibt. Außerdem, wenn der Wert in der Beschreibung eines Elements gefunden wird, wird das Array nicht nur auf dieses Element gefiltert.
Was könnte die Lösung sein, außer die „alten“ Prüfungen wie if (str !== undefined) und Ähnliches zu verwenden?
Antwort #1
Dieses map gibt ein Array von Booleans zurück, das immer wahr ist, egal was passiert, also ist es nicht das Prädikat, das du suchst. Du brauchst Array.some (auch in lodash/underscore/ramda, falls du alte Browser unterstützen willst). Lass mich auch das innere Prädikat ein wenig anpassen:
filterProjects(value: string) {
return this.projects.filter(project =>
[project.key, project.name, project.description].some(str =>
str ? str.toLowerCase().includes(value.toLowerCase().trim()) : false
)
);
}
Antwort #2
Sie können den `Nullish-Koaleszenz-Operator (??)` verwenden
mögen
str => (str ?? "").toLowerCase().indexOf(value.toLowerCase().trim()) >= 0
