Wie durchsuchen Sie ein Array nach einer Teilzeichenfolgenübereinstimmung?
Lesezeit: 1 Minute
reub77
Ich muss ein Array in JavaScript durchsuchen. Die Suche würde nur nach einem Teil der übereinstimmenden Zeichenfolge erfolgen, da die Zeichenfolge zusätzliche Komponenten aufweisen würde. Ich müsste dann das erfolgreich abgeglichene Array-Element mit der vollständigen Zeichenfolge zurückgeben.
Ich muss mit nach dem Array-Element suchen "id-" darin und ich muss auch den Rest des Textes in das Element ziehen (dh "id-3-text").
Wie mache ich das?
Sie könnten das Array einfach filtern results = arr.filter(function (v) {return /id-/.test(v)});. Und dann kann man mit den Ergebnissen machen, was man will.
– zzzzBov
20. April 2016 um 15:50 Uhr
@zzzzBov Dein Kommentar ist eine Antwort wert…
– Skippy le Grand Gourou
23. Mai 2019 um 11:15 Uhr
In Betracht ziehen windowArray.find((string) => string.startsWith("id-")) wenn es dich nur interessiert id- wie möglich Präfix.
– Sebastian Simon
1. November 2021 um 22:52 Uhr
nickb
Wenn Sie verwenden können Unterstrich.js in ihrem projekt, die _.Filter() Die Array-Funktion macht dies zu einem Kinderspiel:
// find all strings in array containing 'thi'
var matches = _.filter(
[ 'item 1', 'thing', 'id-3-text', 'class' ],
function( s ) { return s.indexOf( 'thi' ) !== -1; }
);
Die Iteratorfunktion kann tun, was Sie wollen, solange sie für Übereinstimmungen true zurückgibt. Funktioniert super.
Aktualisierung 03.12.2017:
Dies ist jetzt eine ziemlich veraltete Antwort. Vielleicht nicht die leistungsfähigste Option in einem großen Stapel, aber es kann geschrieben werden Menge kürzer und verwenden Sie native ES6-Array/String-Methoden wie .filter() und .includes() jetzt:
Notiz: Es gibt keine <= IE11-Unterstützung für String.prototype.includes() (Edge funktioniert, wohlgemerkt), aber Sie sind mit einer Polyfill gut, oder greifen Sie einfach darauf zurück indexOf().
@ Floppy88 Nun, die ursprüngliche Frage war die Suche in einem einfachen Array. Es ist jetzt auch ein wenig in die Jahre gekommen (kein Unterstrich erforderlich). Würden Sie nach Objektwerten oder Schlüsseln suchen? Ein Anwendungsbeispiel wäre hilfreich.
– Nickb
4. Dezember 2017 um 0:02 Uhr
Ich muss in Objektschlüsseln suchen
– Floppy88
4. Dezember 2017 um 9:35 Uhr
@Floppy88 Einfach verwenden Object.keys(yourArrayName), die ein Array zurückgibt. Sie können die gleiche Technik wie oben verwenden .filter() es runter.
– Nickb
5. Dezember 2017 um 5:58 Uhr
Die Verwendung der Funktion .filter() ist in den meisten Fällen die beste Methode
– Anand Raja
7. Januar 2020 um 8:37 Uhr
Die Leute hier machen das viel zu schwierig. Mach einfach folgendes…
findIndex() ist eine ES6-Methode höherer Ordnung, die die Elemente eines Arrays durchläuft und den Index des ersten Elements zurückgibt, das bestimmten Kriterien entspricht (als Funktion bereitgestellt). In diesem Fall habe ich die ES6-Syntax verwendet, um die Funktion höherer Ordnung zu deklarieren. element ist der Parameter der Funktion (der ein beliebiger Name sein kann) und der fette Pfeil deklariert das Folgende als anonyme Funktion (die nicht in geschweifte Klammern eingeschlossen werden muss, es sei denn, sie nimmt mehr als eine Zeile ein).
Innerhalb findIndex() Ich habe das sehr einfache verwendet includes() -Methode, um zu prüfen, ob das aktuelle Element die gewünschte Teilzeichenfolge enthält.
Das ist GENAU das, was ich brauchte, und eine großartige moderne Antwort. Stimme zu! Um es weiter zu verwenden, weisen Sie es einer neuen Variablen zu und tun Sie dann, was Sie wollen. Beispiel: meinArray[newVar]
Der obige gibt den Index des ersten Ergebniselements aus dem Array zurück.
Dies gibt die erste Übereinstimmung zurück
– 00-BBB
23. September 2019 um 10:18 Uhr
@00-BBB ersetzen find durch filter
– Merkur
21. Januar 2020 um 3:09 Uhr
Danke @Hos Merkur. Ja, der Filter gibt die Liste zurück
– smnth90
18. Februar 2020 um 10:12 Uhr
TJ Crowder
In Ihrem speziellen Fall können Sie dies einfach mit einem langweiligen alten Zähler tun:
var index, value, result;
for (index = 0; index < windowArray.length; ++index) {
value = windowArray[index];
if (value.substring(0, 3) === "id-") {
// You've found it, the full text is in `value`.
// So you might grab it and break the loop, although
// really what you do having found it depends on
// what you need.
result = value;
break;
}
}
// Use `result` here, it will be `undefined` if not found
Aber wenn Ihr Array ist spärlichkönnen Sie es effizienter mit einem richtig gestalteten tun for..in Schleife:
var key, value, result;
for (key in windowArray) {
if (windowArray.hasOwnProperty(key) && !isNaN(parseInt(key, 10))) {
value = windowArray[key];
if (value.substring(0, 3) === "id-") {
// You've found it, the full text is in `value`.
// So you might grab it and break the loop, although
// really what you do having found it depends on
// what you need.
result = value;
break;
}
}
}
// Use `result` here, it will be `undefined` if not found
Vorsicht naiv for..in Schleifen, die das nicht haben hasOwnProperty und !isNaN(parseInt(key, 10)) Schecks; hier ist der Grund.
Off-Topic:
Eine andere Art zu schreiben
var windowArray = new Array ("item","thing","id-3-text","class");
ist
var windowArray = ["item","thing","id-3-text","class"];
… was für Sie weniger Tippen bedeutet und vielleicht (dies ist subjektiv) etwas leichter zu lesen ist. Die beiden Anweisungen haben genau das gleiche Ergebnis: Ein neues Array mit diesem Inhalt.
JohnnyJS
Suchen Sie einfach nach der Zeichenfolge in Plain Old indexOf
Wenn Sie gemischte Typen in Ihrem Array haben, ist das nur eine schlechte Übung, aber ich habe die Prüfung trotzdem hinzugefügt.
– JohnnyJS
17. Oktober 2018 um 8:24 Uhr
Der einfachste Vanille-Javascript-Code, um dies zu erreichen, ist
var windowArray = ["item", "thing", "id-3-text", "class", "3-id-text"];
var textToFind = "id-";
//if you only want to match id- as prefix
var matches = windowArray.filter(function(windowValue){
if(windowValue) {
return (windowValue.substring(0, textToFind.length) === textToFind);
}
}); //["id-3-text"]
//if you want to match id- string exists at any position
var matches = windowArray.filter(function(windowValue){
if(windowValue) {
return windowValue.indexOf(textToFind) >= 0;
}
}); //["id-3-text", "3-id-text"]
Sie gilt nicht für Nullwerte.
– Tushar Walzade
15. Oktober 2018 um 14:12 Uhr
Wenn Sie gemischte Typen in Ihrem Array haben, ist das nur eine schlechte Übung, aber ich habe die Prüfung trotzdem hinzugefügt.
– JohnnyJS
17. Oktober 2018 um 8:24 Uhr
Tgr
Eine faszinierende Untersuchung einiger der Alternativen und ihrer Effizienz finden Sie in den letzten Beiträgen von John Resig:
(Das dort diskutierte Problem ist etwas anders, da die Heuhaufen-Elemente Präfixe der Nadel sind und nicht umgekehrt, aber die meisten Lösungen sind einfach anzupassen.)
14390000cookie-checkWie durchsuchen Sie ein Array nach einer Teilzeichenfolgenübereinstimmung?yes
Sie könnten das Array einfach filtern
results = arr.filter(function (v) {return /id-/.test(v)});
. Und dann kann man mit den Ergebnissen machen, was man will.– zzzzBov
20. April 2016 um 15:50 Uhr
@zzzzBov Dein Kommentar ist eine Antwort wert…
– Skippy le Grand Gourou
23. Mai 2019 um 11:15 Uhr
In Betracht ziehen
windowArray.find((string) => string.startsWith("id-"))
wenn es dich nur interessiertid-
wie möglich Präfix.– Sebastian Simon
1. November 2021 um 22:52 Uhr