Hallo dedlfix
Es gibt keine contains-Funktion in Javascript, so dass hier indexOf() herhalten muss, bei dem mich nur interessiert, ob es größer als -1 liefert, was für nicht enthalten steht.
var searchTerm = 'test'; // kommt eigentlich aus dem Eingabefeld var filteredRecords = records.filter(function (record) { return record.name.indexOf(searchTerm) > -1; });
record ist mein Array of Objects. Die Objekte haben eine Eigenschaft name, nebst anderen in denen hier nicht gesucht werden soll.
Ich finde, die Prüfung auf Existenz mittels indexOf wie in deinem Beispiel ist nicht wirklich gut lesbar. Wenn wir diesen Aspekt jedoch ignorieren, dann kann man das unter Verwendung des bitweisen NOT-Operators auch etwas kürzer schreiben:
var filteredRecords = records.filter(function (record) {
return ~record.name.indexOf(searchTerm);
});
Tatsächlich gibt es aber mittlerweile eine Methode deren eigentlicher Zweck es ist zu prüfen, ob eine Zeichenkette in einer anderen Zeichenkette enthalten ist, nämlich String.prototype.includes:
const filteredRecords = records.filter(record => record.name.includes(searchTerm));
Das ist deutlich besser lesbar, denke ich.
Wenn es das Ziel ist, die Indexposition eines Teilstrings zu ermitteln, dann kann indexOf oder lastIndexOf verwendet werden. Geht es aber darum zu prüfen, ob ein Teilstring in einem anderen String enthalten ist, dann ist includes das Mittel der Wahl.
Die Methode includes wird allerdings noch nicht von allen relevanten Browsern unterstützt, weshalb vorerst ein Polyfill bereitgestellt werden sollte. Ein solches ist jedoch schnell geschrieben und noch schneller kopiert und eingefügt.
String.prototype.includes besitzt darüber hinaus auch Schwestermethoden. Eine gleichnamige Methode ist zum Beispiel auch für Arrays definiert:
const numbers = [1, 2, 3, 4, 5];
console.log(numbers.includes(3), numbers.includes(7)); // true false
Zu der Methode Array.prototype.includes habe ich vor einiger Zeit einen recht umfangreichen Artikel im Wiki geschrieben, der auch ein Polyfill enthält. Der Rückgriff auf indexOf in solchen Fällen ist also auch bei Arrays nicht mehr nötig.
const typedArray = new Uint8Array([1, 2, 3, 4, 5]);
console.log(typedArray.includes(5)); // true
Gleiches gilt für TypedArrays, die ebenfalls eine includes-Methode besitzen.
Gruß,
Orlok