Ich versuche, eine Funktion zu schreiben, die entweder eine Liste von Zeichenfolgen oder eine einzelne Zeichenfolge akzeptiert. Wenn es sich um eine Zeichenfolge handelt, möchte ich sie in ein Array mit nur einem Element konvertieren, damit ich sie ohne Angst vor einem Fehler durchlaufen kann.
Wie überprüfe ich, ob die Variable ein Array ist?
Ich habe die verschiedenen Lösungen unten zusammengefasst und einen jsperf-Test erstellt . Sie sind alle schnell, also verwenden Sie Array.isArray
sie einfach - sie werden jetzt gut unterstützt und funktionieren rahmenübergreifend .
arr.constructor === Array
ist am schnellsten.arr.constructor === Array
Test false zurückgibt, wenn Sie Ihren Konstruktor aus irgendeinem Grund über einen Prototyp überschreiben .Array.isArray(arr)
gibt aber immer noch true zurück.Antworten:
In modernen Browsern können Sie dies tun
( Unterstützt von Chrome 5, Firefox 4.0, IE 9, Opera 10.5 und Safari 5)
Aus Gründen der Abwärtskompatibilität können Sie Folgendes hinzufügen
Wenn Sie jQuery verwenden, können Sie
jQuery.isArray(obj)
oder verwenden$.isArray(obj)
. Wenn Sie Unterstrich verwenden, können Sie verwenden_.isArray(obj)
Wenn Sie keine Arrays erkennen müssen, die in verschiedenen Frames erstellt wurden, können Sie diese auch einfach verwenden
instanceof
quelle
Array.isArray
if (typeof Array.isArray === 'undefined') {
könnte geändert werden zuif(!Array.isArray) {
Object.prototype.string.call(obj)
kann gefälscht werden, wenn das Objekt darauf istSymbol.toStringTag
. Das heißt, ich kenne keine Umgebung, die versendet,Symbol.toStringTag
aber nichtArray.isArray
so scheint dies sicher.instanceof Array
fehl, wenn das Array aus einem anderen Frame stammt?instanceof Array
schlägt fehl, wenn das Array aus einem anderen Frame stammt, da jedes Array aus diesem anderen Frame einen anderenArray
Konstruktor und Prototyp hat. Aus Kompatibilitäts- / Sicherheitsgründen verfügt jeder Frame über eine eigene globale Umgebung, einschließlich globaler Objekte. DasObject
Globale von einem Frame unterscheidet sich vomObject
Globalen von einem anderen. So auch fürArray
Globale. Axel Rauschmayer spricht mehr darüber .Die im ECMAScript-Standard angegebene Methode zum Ermitteln der Objektklasse besteht darin, die
toString
Methode von zu verwendenObject.prototype
.Oder Sie können
typeof
testen, ob es sich um einen String handelt:Wenn Sie sich keine Gedanken über die Leistung machen, können Sie auch
concat
ein neues leeres Array bearbeiten.Es gibt auch den Konstruktor, den Sie direkt abfragen können:
Schauen Sie sich eine gründliche Behandlung in @TJ Crowders Blog an, wie in seinem Kommentar unten veröffentlicht.
Schauen Sie sich diesen Benchmark an, um eine Vorstellung davon zu bekommen, welche Methode eine bessere Leistung erbringt: http://jsben.ch/#/QgYAV
Konvertieren Sie von @Bharath einen String mit Es6 in ein Array für die gestellte Frage:
annehmen:
quelle
toString
ist einer der Wege. Ich mache hier eine kleinetypeof new String('beans')
> 'Objekt'Array.isArray(obj)
Ich würde zuerst prüfen, ob Ihre Implementierung Folgendes unterstützt
isArray
:Sie können auch versuchen, den
instanceof
Operator zu verwendenquelle
v instanceof Array
gibt false zurück, wennv
es in einem anderen Frame erstellt wurde (v
ist eine Instanz derthatFrame.contentWindow.Array
Klasse).Array.isArray
ist als Teil von ECMAScript 5 / Javascript 1.8.5 definiert.return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
jQuery bietet auch eine
$.isArray()
Methode:quelle
$.isArray === Array.isArray
kehrt wahr zurück.Array.isArray
hinter den Kulissen: github.com/jquery/jquery/blob/master/src/core.js#L211Dies ist die schnellste unter allen Methoden (alle Browser werden unterstützt):
quelle
if (obj && Array === obj.constructor)
im Gegensatz zuif (obj && obj.constructor === Array)
? Ist es eine verlorene Übersetzung ins Englische, dann um etwas zu codieren? Beispielsweise fragen englische Sprecher im Allgemeinen: "Existiert das Objekt und stammt der Konstruktor aus der Array-Klasse?", sodass der Codefluss beim Lesen logischer ist. oder gibt es einen technischen grund?function object_type(o){var t = typeof(o);return ((t==="object") && (o.constructor===Array)) ? "array" : t;} /*allows you to */ switch(object_type(o)){ case 'array': break; case 'object' : o.dosomething();}
Stellen Sie sich vor, Sie haben dieses Array unten :
Javascript (neue und ältere Browser):
oder
oder
dann nenne es so:
Javascript (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)
jQuery:
Winkel:
Unterstrich und Lodash:
quelle
Array.isArray funktioniert schnell, wird jedoch nicht von allen Browserversionen unterstützt. Sie können also eine Ausnahme für andere machen und die universelle Methode verwenden:
quelle
.toString()
Methode von erhaltenObject.prototype
. Im Moment verwenden Sie daswindow.toString()
, was nicht dasselbe ist.window.toString
Machen Sie dasselbe wieObject.prototype.toString
in Chrome.Einfache Funktion, um dies zu überprüfen:
quelle
return object.constructor === Array
- aber sind Sie sicher, dass dies nur für Arrays wahr ist?if(x) return true; else return false
:-) Auch wenn es rückwärts ist, solltest du den Ausdruck negieren.Wie MDN sagt hier :
So was:
Object.prototype.toString.call(arr) === '[object Array]'
, oderArray.isArray(arr)
quelle
Für diese Frage gibt es nur eine einzeilige Lösung
Dabei ist x die Variable, die true zurückgibt, wenn x ein Array ist, und false, wenn dies nicht der Fall ist.
quelle
typeof
Vergleich.{}
ein Array ist, wird ein Syntaxfehler angezeigt.Sie können den Typ Ihrer Variablen überprüfen, ob es sich um ein Array mit handelt.
quelle
instanceof
. Ich denke, es scheitert unter ein paar seltsamen Szenarien.Ich würde eine Funktion erstellen, um den Objekttyp zu testen, mit dem Sie es zu tun haben ...
dann können Sie eine einfache if-Anweisung schreiben ...
quelle
Ich mache das auf sehr einfache Weise. Funktioniert bei mir. Irgendwelche Nachteile?
quelle
{isArray:true}
JSON.parse(someDataFromElsewhere).items.isArray
könnte true zurückgeben (abhängig von den Daten) und Ihren Code beschädigen.Dies ist mein Versuch, diese Antwort unter Berücksichtigung der Kommentare zu verbessern :
Das if / else wird entfernt und die Möglichkeit berücksichtigt, dass das Array null oder undefiniert ist
quelle
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray
quelle
Ich habe die jsperf-Geige mit zwei alternativen Methoden sowie der Fehlerprüfung aktualisiert .
Es stellt sich heraus, dass die Methode, die einen konstanten Wert in den Prototypen 'Object' und 'Array' definiert, schneller ist als alle anderen Methoden. Es ist ein etwas überraschendes Ergebnis.
Diese beiden Methoden funktionieren nicht, wenn die Variable den undefinierten Wert annimmt, aber sie funktionieren, wenn Sie sicher sind, dass sie einen Wert haben. In Bezug auf die Überprüfung der Leistung, ob ein Wert ein Array oder ein einzelner Wert ist, sieht die zweite Methode wie eine gültige schnelle Methode aus. Es ist etwas schneller als "instanceof" in Chrome, doppelt so schnell wie die zweitbeste Methode in Internet Explorer, Opera und Safari (auf meinem Computer).
quelle
Ich weiß, dass die Leute nach einem rohen Javascript-Ansatz suchen. Wenn Sie jedoch weniger darüber nachdenken möchten, schauen Sie hier: http://underscorejs.org/#isArray
Gibt true zurück, wenn das Objekt ein Array ist.
quelle
Die beste Lösung, die ich gesehen habe, ist ein browserübergreifender Ersatz für typeof. Überprüfen Sie hier die Lösung von Angus Croll .
Die TL; DR-Version ist unten aufgeführt, aber der Artikel enthält eine gute Diskussion des Problems. Sie sollten ihn daher lesen, wenn Sie Zeit haben.
quelle
Hier ist mein fauler Ansatz:
Ich weiß, dass es ein Sakrileg ist, sich mit dem Prototyp "herumzuschlagen", aber es scheint deutlich besser zu funktionieren als die empfohlene
toString
Methode .Hinweis: Ein Nachteil dieses Ansatzes ist, dass er nicht über
iframe
Grenzen hinweg funktioniert , aber für meinen Anwendungsfall ist dies kein Problem.quelle
wat = {array_: true}
Gegenständen getäuscht .obj.array_ = true
, dann täuschen Sie sich nur .cache
Objekt zum Speichern von Suchergebnissen vor, das die Suchzeichenfolgen als Eigenschaftsschlüssel verwendet. Was ist, wenn ein Benutzer suchtarray_
? Wird Ihr Objekt dadurch zu einem Array? Es ist nur ein Fehler..array_
zum Markieren von Arrays verwendet wird. Das ist hier wirklich nicht der Fall,.array
kann alles bedeuten. Sie sollten mindestens eine beschreibende Zeichenfolge verwenden und die Unangemessenheit einer willkürlichen Verwendung signalisieren, z.__isArray = true
. B. mit .In Stoyan Stefanovs Buch JavaScript Patterns gibt es ein schönes Beispiel, das alle möglichen Probleme behandelt und die ECMAScript 5-Methode Array.isArray () verwendet. .
Hier ist es also:
Übrigens, wenn Sie jQuery verwenden, können Sie die Methode $ .isArray () verwenden.
quelle
if(!Array.isArray) {...
?Der einfachste und schnellste Weg, um zu überprüfen, ob ein Objekt ein Array ist oder nicht.
oder
oder Sie können eine Dienstprogrammfunktion erstellen:
Verwendungszweck:
quelle
Folgendes kann verwendet werden, wenn Sie wissen, dass Ihr Objekt keine Concat-Methode hat.
quelle
Sie könnten isArray-Methode, aber ich würde lieber mit überprüfen
Object.getPrototypeOf(yourvariable) === Array.prototype
quelle
Object.getPrototypeOf(yourvariable)
gibt den Prototyp eines Array-Objekts zurück. Und der Code ist am schnellsten und sichersten.Wenn die einzigen zwei Arten von Werten, die an diese Funktion übergeben werden können, eine Zeichenfolge oder ein Array von Zeichenfolgen sind, halten Sie es einfach und
typeof
überprüfen Sie die Zeichenfolgenmöglichkeit:quelle
Auf der Suche nach der kürzesten Version habe ich hier das bekommen.
Beachten Sie, dass es keine perfekte Funktion gibt, die immer alle möglichen Kombinationen erkennt. Es ist besser, alle Fähigkeiten und Einschränkungen Ihrer Werkzeuge zu kennen, als ein magisches Werkzeug zu erwarten.
quelle
A.map !== undefined
aber ja, das könnte eine rutschige Straße in der Welt der Affen-Patcher sein;)quelle
Eine einfache Funktion zum Testen, ob ein Eingabewert ein Array ist, ist die folgende:
Dies funktioniert browserübergreifend und mit älteren Browsern. Dies stammt aus dem Blog-Beitrag von TJ Crowders
quelle
Sie können dies versuchen:
quelle
Diese Funktion verwandelt fast alles in ein Array:
Es werden einige neuere Browserfunktionen verwendet, sodass Sie diese möglicherweise für maximale Unterstützung mehrfach ausfüllen möchten.
Beispiele:
NB-Zeichenfolgen werden in ein Array mit einem einzelnen Element anstelle eines Arrays von Zeichen konvertiert. Löschen Sie den
isString
Scheck, wenn Sie ihn umgekehrt bevorzugen.Ich habe
Array.isArray
hier verwendet , weil es das robusteste und auch einfachste ist.quelle
In Ihrem Fall können Sie eine Array-
concat
Methode verwenden, die sowohl einzelne Objekte als auch Arrays (und sogar kombinierte) akzeptieren kann:concat
scheint eine der ältesten Methoden von Array zu sein (selbst IE 5.5 weiß es gut).quelle