In SQL können wir sehen, ob sich eine Zeichenfolge in einer Liste wie folgt befindet:
Column IN ('a', 'b', 'c')
Was ist ein guter Weg, dies in JavaScript zu tun? Es ist so klobig, das zu tun:
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
// do something
}
Und ich bin mir nicht sicher über die Leistung oder Klarheit davon:
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
// do something
}
Oder man könnte die Schalterfunktion verwenden:
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
Aber das ist ein schreckliches Durcheinander. Irgendwelche Ideen?
In diesem Fall muss ich Internet Explorer 7 für eine Unternehmens-Intranetseite verwenden. Funktioniert also ['a', 'b', 'c'].indexOf(str) !== -1
nicht nativ ohne etwas Syntaxzucker.
javascript
string
list
ErikE
quelle
quelle
Antworten:
Sie können anrufen
indexOf
:quelle
Array.prototype.indexOf
ist, dass es im IE nicht funktioniert, leider fehlt sogar dem IE8 diese Methode.Array.indexOf
vor dem Überschreiben vorhanden ist,Array.prototype.indexOf
was nicht dasselbe ist. Ich würde die Implementierung von Mozilla empfehlen, die hier verfügbar ist: developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/…EcmaScript 6
Wenn Sie ES6 verwenden, können Sie ein Array der Elemente erstellen und Folgendes verwenden
includes
:Dies hat einige inhärente Vorteile gegenüber,
indexOf
da es das VorhandenseinNaN
in der Liste ordnungsgemäß testen und fehlende Array-Elemente wie das mittlere in[1, , 2]
mit übereinstimmen kannundefined
.includes
funktioniert auch mit JavaScript-typisierten Arrays wieUint8Array
.Wenn Sie Bedenken hinsichtlich der Browserunterstützung haben (z. B. für IE oder Edge), können Sie dies bei CanIUse.Com überprüfen.
Array.includes
Wenn Sie auf eine fehlende Browser- oder Browserversion abzielen möchtenincludes
, empfehle ich polyfill.io für das Polyfilling.Ohne Array
Sie können
isInList
Zeichenfolgen wie folgt eine neue Eigenschaft hinzufügen :Dann benutze es so:
Sie können das Gleiche für tun
Number.prototype
.Array.indexOf
Wenn Sie einen modernen Browser verwenden,
indexOf
funktioniert dies immer. Für IE8 und frühere Versionen benötigen Sie jedoch eine Polyfüllung.Wenn
indexOf
-1 zurückgegeben wird, befindet sich das Element nicht in der Liste. Beachten Sie jedoch, dass diese Methode nicht ordnungsgemäß überprüftNaN
wird und zwar mit einem explizitenundefined
Element übereinstimmen kann, jedoch nicht mit einem fehlenden Elementundefined
wie im Array[1, , 2]
.Polyfill für
indexOf
oderincludes
im IE oder einem anderen Browser / einer anderen Version ohne UnterstützungWenn Sie einen Dienst wie polyfill.io nicht wie oben erwähnt verwenden möchten , können Sie jederzeit benutzerdefinierte Polyfills in Ihren eigenen Quellcode aufnehmen, die den Standards entsprechen. Zum Beispiel hat Mozilla Developer Network eine für
indexOf
.In dieser Situation, in der ich eine Lösung für Internet Explorer 7 erstellen musste, habe ich meine eigene einfachere Version der
indexOf()
Funktion "gerollt" , die nicht den Standards entspricht:Ich denke jedoch nicht, dass Änderungen
Array.prototype
auf lange Sicht die beste Antwort sind. ÄnderungenObject
undArray
Prototypen in JavaScript können zu schwerwiegenden Fehlern führen. Sie müssen entscheiden, ob dies in Ihrer eigenen Umgebung sicher ist. Wichtig ist, dass beim Iterieren eines Arrays (wenn Array.prototype Eigenschaften hinzugefügt hat) mitfor ... in
der neue Funktionsname als einer der Schlüssel zurückgegeben wird:Ihr Code funktioniert jetzt möglicherweise, aber in dem Moment, in dem jemand in Zukunft eine JavaScript-Bibliothek oder ein Plugin eines Drittanbieters hinzufügt, das nicht eifrig vor geerbten Schlüsseln schützt, kann alles kaputt gehen.
Die alte Methode, um diesen Bruch zu vermeiden, besteht darin, während der Aufzählung jeden Wert zu überprüfen, um festzustellen, ob das Objekt ihn tatsächlich als nicht vererbte Eigenschaft hat,
if (arr.hasOwnProperty(x))
und erst dann damit zu arbeitenx
.Der neue ES6-Weg, um dieses Problem mit zusätzlichen Schlüsseln zu vermeiden, besteht darin,
of
anstelle vonin
,for (let x of arr)
. Wenn Sie jedoch nicht garantieren können, dass alle Ihre Code- und Drittanbieter-Bibliotheken sich strikt an diese Methode halten, möchten Sie sie für die Zwecke dieser Frage wahrscheinlich nurincludes
wie oben angegeben verwenden.quelle
indexOf
von MDN zur Verfügung gestellt. Es macht im Grunde das Gleiche, aber mit ein paar Kurzschlüssen zur einfachen Auswertung.Die meisten Antworten deuten auf die
Array.prototype.indexOf
Methode hin. Das einzige Problem besteht darin, dass sie in keiner IE-Version vor IE9 funktioniert .Als Alternative lasse ich Ihnen zwei weitere Optionen, die in allen Browsern funktionieren:
quelle
"HiFooThere"
- ich würde/^(?:Foo|Bar|Baz)$/
stattdessen gehen (Anfang der Zeichenfolge, nicht erfassende Gruppe, Ende der Zeichenfolge).indexOf
wird jetzt laut IEN in IE 9 und höher unterstützt .Arrays verfügen über eine
indexOf
Methode, mit der nach Zeichenfolgen gesucht werden kann:quelle
Ein Trick, den ich benutzt habe, ist
Sie könnten so etwas tun
quelle
var i=a.length;while (i--) {/*use a[i]*/}
ist , ist die schnellste Schleifenmethode (wenn die umgekehrte Reihenfolge akzeptabel ist).Hier ist meins:
Dieser ist schneller, wenn Sie ein Array übergeben können:
Hier ist der jsperf: http://jsperf.com/bmcgin-inlsit
quelle
Array
den Prototyp handeln: vielleicht so etwas wieArray.prototype.contains
.RegExp
ist universell, aber ich verstehe, dass Sie mit Arrays arbeiten. Schauen Sie sich diesen Ansatz an. Ich benutze es, und es ist sehr effektiv und blitzschnell!Sie können auch einige Änderungen vornehmen, z.
Einzeiler
Groß- und Kleinschreibung wird nicht berücksichtigt
Und viele andere!
quelle
Verwenden von indexOf (funktioniert nicht mit IE8).
Um IE8 zu unterstützen, können Sie Mozillas indexOf implementieren.
Reguläre Ausdrücke über String.prototype.match (docs).
quelle
Sieht so aus, als müssten Sie die Funktion in_array verwenden.
jQuery -> inArray
Prototyp -> Array.indexOf
Oder sehen Sie sich diese Beispiele an, wenn Sie jQuery oder Prototype nicht verwenden:
Stilistische Anmerkung: Variablen mit dem Namen thisthing thatthing sollten benannt werden, um Ihnen etwas darüber zu sagen, was sie enthalten (Substantiv).
quelle
Zusätzlich zu
indexOf
(was andere Poster vorgeschlagen haben) kann die Verwendung von Enumerable.include () des Prototyps dies übersichtlicher und prägnanter machen:quelle
Vielen Dank für die Frage und die Lösung mit der Array.indexOf-Methode.
Ich habe den Code aus dieser Lösung verwendet, um eine inList () -Funktion zu erstellen, die IMO das Schreiben einfacher und das Lesen klarer macht:
VERWENDUNG:
quelle
'Houston'.inList(['LA', 'New York', 'Houston'])
. Vielleichtif (!String.prototype.inList) {String.prototype.inList = function(arr) {return arr.indexOf(this) >= 0};}
oder mit Ihrerwhile
Methode.Ich bin überrascht, dass niemand eine einfache Funktion erwähnt hat, die eine Zeichenfolge und eine Liste enthält.
quelle
int
, bei der einige Leute auf diese Frage stoßen und nach einerbool
Rückkehr suchen . Ich dachte, es könnte ein paar Leuten helfen.Meine Lösung führt zu einer Syntax wie folgt:
Und ich implementiere dies, indem ich den grundlegenden Objektprototyp wie folgt erweitere:
Wir könnten alternativ die Methode isInArray (aber wahrscheinlich nicht inArray) oder einfach isIn nennen.
Vorteile: Einfach, unkompliziert und selbstdokumentierend.
quelle
myValues[key];
wobei myValues ein Objekt und der Schlüssel eine beliebige Zeichenfolge oder Zahl ist.Eine vereinfachte Version der Antwort von SLaks funktioniert auch:
.... da Strings selbst Arrays sind. :) :)
Implementieren Sie bei Bedarf die Indexof-Funktion für Internet Explorer wie zuvor beschrieben.
quelle