Wie überprüfe ich, ob ein Objekt ein Array ist?

2753

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.isArraysie einfach - sie werden jetzt gut unterstützt und funktionieren rahmenübergreifend .

mpen
quelle
6
Ich dachte, Sie wollten überprüfen, ob das Objekt ein Array ist, aber Sie möchten überprüfen, ob das Objekt ein Array von Zeichenfolgen oder eine einzelne Zeichenfolge ist. Nicht sicher, ob Sie es sehen? Oder bin es nur ich? Ich dachte an etwas mehr wie dieses ... bin ich derjenige hier etwas fehlt?
rr1g0
149
TL; DR - arr.constructor === Arrayist am schnellsten.
Neta
3
jsben.ch/#/QgYAV - ein Benchmark für die gängigsten Methoden
EscapeNetscape
39
TL; DR - Array. isArray (arr) seit ES5; und $. isArray (arr) in jQuery.
Ondra Žižka
6
Denken Sie daran, dass dieser arr.constructor === ArrayTest false zurückgibt, wenn Sie Ihren Konstruktor aus irgendeinem Grund über einen Prototyp überschreiben . Array.isArray(arr)gibt aber immer noch true zurück.
Ghaschel

Antworten:

978

In modernen Browsern können Sie dies tun

Array.isArray(obj)

( 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

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

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

obj instanceof Array
Fela Winkelmolen
quelle
9
Hier ist eine vollständigere Liste der Browser, die unterstützenArray.isArray
Lightswitch05
if (typeof Array.isArray === 'undefined') {könnte geändert werden zuif(!Array.isArray) {
iMatoria
Denn was es wert ist, Object.prototype.string.call(obj)kann gefälscht werden, wenn das Objekt darauf ist Symbol.toStringTag. Das heißt, ich kenne keine Umgebung, die versendet, Symbol.toStringTagaber nicht Array.isArrayso scheint dies sicher.
Benjamin Gruenbaum
5
Warum schlägt instanceof Arrayfehl, wenn das Array aus einem anderen Frame stammt?
NobleUplift
16
@NobleUplift: instanceof Arrayschlägt fehl, wenn das Array aus einem anderen Frame stammt, da jedes Array aus diesem anderen Frame einen anderen ArrayKonstruktor und Prototyp hat. Aus Kompatibilitäts- / Sicherheitsgründen verfügt jeder Frame über eine eigene globale Umgebung, einschließlich globaler Objekte. Das ObjectGlobale von einem Frame unterscheidet sich vom ObjectGlobalen von einem anderen. So auch für ArrayGlobale. Axel Rauschmayer spricht mehr darüber .
jschoi
1943

Die im ECMAScript-Standard angegebene Methode zum Ermitteln der Objektklasse besteht darin, die toStringMethode von zu verwenden Object.prototype.

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' );
}

Oder Sie können typeoftesten, ob es sich um einen String handelt:

if( typeof someVar === 'string' ) {
    someVar = [ someVar ];
}

Wenn Sie sich keine Gedanken über die Leistung machen, können Sie auch concatein neues leeres Array bearbeiten.

someVar = [].concat( someVar );

Es gibt auch den Konstruktor, den Sie direkt abfragen können:

if (somevar.constructor.name == "Array") {
    // do something
}

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:

const convertStringToArray = (object) => {
   return (typeof object === 'string') ? Array(object) : object 
}

annehmen:

let m = 'bla'
let n = ['bla','Meow']
let y = convertStringToArray(m)
let z = convertStringToArray(n)
console.log('check y: '+JSON.stringify(y)) . // check y: ['bla']
console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']
user113716
quelle
65
+1 Ja, toStringist einer der Wege. Ich mache hier eine kleine
TJ Crowder
3
typeof new String('beans') > 'Objekt'
Ben
16
Wenn Sie "[object Array]" nicht eingeben möchten, verwenden Sie Object.prototype.toString.call (someVar) === Object.prototype.toString.call ([]) oder erstellen Sie eine praktische Funktion, um den Typ abzurufen, wenn Sie dies nicht tun Ich möchte nicht Object.prototype.toString.call
Pramod
13
Ich benutze das vanilla Array.isArray, das in 'modernen Browsern' funktioniert (dh IE9 + und alle anderen). Und für die Unterstützung alter Browser verwenden Sie den Shim von MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
David Gilbertson
21
Lebe in der modernen Welt -Array.isArray(obj)
mcfedr
1274

Ich würde zuerst prüfen, ob Ihre Implementierung Folgendes unterstützt isArray:

if (Array.isArray)
    return Array.isArray(v);

Sie können auch versuchen, den instanceofOperator zu verwenden

v instanceof Array
ChaosPandion
quelle
127
v instanceof Arraygibt false zurück, wenn ves in einem anderen Frame erstellt wurde ( vist eine Instanz der thatFrame.contentWindow.ArrayKlasse).
pepkin88
47
Um genau zu sein: Array.isArrayist als Teil von ECMAScript 5 / Javascript 1.8.5 definiert.
Jevon
8
Wirklich einfache und ordentliche Lösung, ABER isArray ist mit einigen älteren Browsern (ex IE7 und IE8) nicht kompatibel. Quelle: kangax.github.io/es5-compat-table/#
Wookie88
2
Wie wäre es mit: if (Array.isArray) return Array.isArray (v); sonst v Instanz des Arrays zurückgeben;
Lewdev
1
oder einfach:return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
Stijn de Witt
298

jQuery bietet auch eine $.isArray()Methode:

var a = ["A", "AA", "AAA"];

if($.isArray(a)) {
  alert("a is an array!");
} else {
  alert("a is not an array!");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

janr
quelle
27
Nur eine Anmerkung, jQuery verwendet die toString-Methode intern: GitHub Source
Jacob Squires
5
@ JacobSquires es kommt darauf an. Ich habe gerade hier getestet, die neueste jQuery auf Chrome - $.isArray === Array.isArraykehrt wahr zurück.
Renan
3
@ Renan: Das ist das Gute an der Verwendung von jQuery. Normalerweise wird die modernste und beste Methode verwendet, und Sie müssen nicht alle Funktionen selbst überprüfen, um zu wissen, was zu verwenden ist.
Ehrfurcht
jQuery verwendet Array.isArrayhinter den Kulissen: github.com/jquery/jquery/blob/master/src/core.js#L211
Sergiu
1
Aber niemand wird jQuery NUR FÜR diese Funktionalität verwenden, oder? Ich würde nicht einfach jquery herunterladen, weil ich überprüfen möchte, ob etwas ein Array ist: p
Automagisch
106

Dies ist die schnellste unter allen Methoden (alle Browser werden unterstützt):

function isArray(obj){
    return !!obj && obj.constructor === Array;
}
Shinobi
quelle
2
Sie haben Recht, das ist das schnellste nach den Tests, die ich in die Frage aufgenommen habe.
Mpen
5
Gibt es Nachteile bei der Verwendung dieser Methode? Es scheint viel einfacher und effektiver zu sein als die akzeptierte Top-Antwort.
David Meza
@shinobi - nur neugierig (und ich habe das oft gesehen) - warum formulierst du die Bedingung if (obj && Array === obj.constructor)im Gegensatz zu if (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?
unsynchronisiert
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();}
synchronisiert
3
@ Shinobi alles gut. Ich nehme an, es könnte ein Kater aus einer sicheren Gewohnheit sein - wenn Sie versehentlich = statt == verwenden, würde es nicht kompiliert, da es keine zuweisbare Variable ist.
synchronisiert
47

Stellen Sie sich vor, Sie haben dieses Array unten :

var arr = [1,2,3,4,5];

Javascript (neue und ältere Browser):

function isArray(arr) {
  return arr.constructor.toString().indexOf("Array") > -1;
}

oder

function isArray(arr) {
  return arr instanceof Array;
}

oder

function isArray(arr) {
  return Object.prototype.toString.call(arr) === '[object Array]';
}

dann nenne es so:

isArray(arr);

Javascript (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)

Array.isArray(arr);

jQuery:

$.isArray(arr);

Winkel:

angular.isArray(arr);

Unterstrich und Lodash:

_.isArray(arr);
Alireza
quelle
34

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:

    Utils = {};    
    Utils.isArray = ('isArray' in Array) ? 
        Array.isArray : 
        function (value) {
            return Object.prototype.toString.call(value) === '[object Array]';
        }
CruorVult
quelle
3
Sie müssen die .toString()Methode von erhalten Object.prototype. Im Moment verwenden Sie das window.toString(), was nicht dasselbe ist.
Das System
Du hast recht. window.toStringMachen Sie dasselbe wie Object.prototype.toStringin Chrome.
CruorVult
isArray ist überhaupt nicht schnell. Es ist die langsamste Methode.
jemiloii
Warum nicht einfach Array statt Utils hinzufügen? (Ich weiß, dass Sie keine zusätzlichen Eigenschaften für neue Array-Objekte wünschen, aber ich denke, dass dies nur passiert, wenn Sie isArray zu Array.prototype hinzufügen.)
David Winiecki
27

Einfache Funktion, um dies zu überprüfen:

function isArray(object)
{
    return object.constructor === Array;
}
MidnightTortoise
quelle
16
Ich würde das auf eine Zeile reduzieren return object.constructor === Array- aber sind Sie sicher, dass dies nur für Arrays wahr ist?
Mpen
12
Kann das mit allen booleschen Ausdrücken machen. Macht mich verrückt, wenn ich sehe if(x) return true; else return false:-) Auch wenn es rückwärts ist, solltest du den Ausdruck negieren.
Mpen
3
Der Grund, warum dies für getElementsByTagName nicht true zurückgibt, ist, dass das Ergebnis dieser Funktion tatsächlich eine HTMLCollection und kein Array ist.
Yuval A.
6
Dies schlägt fehl, wenn das Objekt undefiniert oder null ist.
John Henckel
1
@ JohnHenckel Siehe meine Antwort stackoverflow.com/a/29400289/34806 Es berücksichtigt sowohl Ihr Anliegen als auch den allerersten Kommentar, alles in einer Zeile
Dexygen
17

Wie MDN sagt hier :

Verwenden Sie Array.isArray oder Object.prototype.toString.call , um reguläre Objekte von Arrays zu unterscheiden

So was:

  • Object.prototype.toString.call(arr) === '[object Array]', oder

  • Array.isArray(arr)

ajax333221
quelle
17

Für diese Frage gibt es nur eine einzeilige Lösung

x instanceof Array

Dabei ist x die Variable, die true zurückgibt, wenn x ein Array ist, und false, wenn dies nicht der Fall ist.

Vikash Kumar
quelle
Viel sauberer und zukunftssicher! Dies oder ein typeofVergleich.
ChristoKiwi
Ist dies etwas, das eine gute Menge an Browser-Unterstützung erhält? Ich mag das.
Dan Zuzevich
1
Leider ist dies ohne try / catch nicht wirklich nützlich, denn wenn "x" ein Objekt wie {}ein Array ist, wird ein Syntaxfehler angezeigt.
Abalter
15

Sie können den Typ Ihrer Variablen überprüfen, ob es sich um ein Array mit handelt.

var myArray=[];

if(myArray instanceof Array)
{
....
}
Ahmet DAL
quelle
1
Einige Leute haben bereits erwähnt instanceof. Ich denke, es scheitert unter ein paar seltsamen Szenarien.
Mpen
15

Ich würde eine Funktion erstellen, um den Objekttyp zu testen, mit dem Sie es zu tun haben ...

function whatAmI(me){ return Object.prototype.toString.call(me).split(/\W/)[2]; }

// tests
console.log(
  whatAmI(["aiming","@"]),
  whatAmI({living:4,breathing:4}),
  whatAmI(function(ing){ return ing+" to the global window" }),
  whatAmI("going to do with you?")
);

// output: Array Object Function String

dann können Sie eine einfache if-Anweisung schreiben ...

if(whatAmI(myVar) === "Array"){
    // do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
    // do string stuff
}
Billy Moon
quelle
12

Ich mache das auf sehr einfache Weise. Funktioniert bei mir. Irgendwelche Nachteile?

Array.prototype.isArray = true;

a=[]; b={};
a.isArray  // true
b.isArray  // (undefined -> false)
rsbkk
quelle
7
getäuscht von{isArray:true}
Bergi
JSON.parse(someDataFromElsewhere).items.isArraykönnte true zurückgeben (abhängig von den Daten) und Ihren Code beschädigen.
Roy Tinker
12

Dies ist mein Versuch, diese Antwort unter Berücksichtigung der Kommentare zu verbessern :

var isArray = myArray && myArray.constructor === Array;

Das if / else wird entfernt und die Möglichkeit berücksichtigt, dass das Array null oder undefiniert ist

Sauerstoff
quelle
Konstruktor ist nicht verfügbar in ES5
TechTurtle
11

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.

/* Initialisation */
Object.prototype.isArray = function() {
  return false;
};
Array.prototype.isArray = function() {
  return true;
};
Object.prototype._isArray = false;
Array.prototype._isArray = true;

var arr = ["1", "2"];
var noarr = "1";

/* Method 1 (function) */
if (arr.isArray()) document.write("arr is an array according to function<br/>");
if (!noarr.isArray()) document.write("noarr is not an array according to function<br/>");
/* Method 2 (value) - **** FASTEST ***** */
if (arr._isArray) document.write("arr is an array according to member value<br/>");
if (!noarr._isArray) document.write("noarr is not an array according to member value<br/>");

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).

le_top
quelle
9

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

_.isArray(object) 

Gibt true zurück, wenn das Objekt ein Array ist.

(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true
Eugene
quelle
7
"Sofern kein anderes Tag für ein Framework / eine Bibliothek enthalten ist, wird eine reine JavaScript-Antwort erwartet."
Michał Perłakowski
5

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.

Object.toType = function(obj) {
    return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
}
// ... and usage:
Object.toType([1,2,3]); //"array" (all browsers)

// or to test...
var shouldBeAnArray = [1,2,3];
if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};
John Wundes
quelle
5

Hier ist mein fauler Ansatz:

if (Array.prototype.array_ === undefined) {
  Array.prototype.array_ = true;
}

// ...

var test = [],
    wat = {};

console.log(test.array_ === true); // true
console.log(wat.array_ === true);  // false

Ich weiß, dass es ein Sakrileg ist, sich mit dem Prototyp "herumzuschlagen", aber es scheint deutlich besser zu funktionieren als die empfohlene toStringMethode .

Hinweis: Ein Nachteil dieses Ansatzes ist, dass er nicht über iframeGrenzen hinweg funktioniert , aber für meinen Anwendungsfall ist dies kein Problem.

namuol
quelle
Es ist nicht mehr besser in Bezug auf die Leistung, zumindest auf FF30 unter Ubuntu 64-Bit
Test30
2
von wat = {array_: true}Gegenständen getäuscht .
Bergi
@Bergi: Ja, das sollte klar sein. Wenn Sie einstellen obj.array_ = true, dann täuschen Sie sich nur .
Namuol
@namuol: Ich täusche mich nicht unbedingt. Oft werden genug Objekte als Wörterbücher verwendet. Stellen Sie sich ein cacheObjekt zum Speichern von Suchergebnissen vor, das die Suchzeichenfolgen als Eigenschaftsschlüssel verwendet. Was ist, wenn ein Benutzer sucht array_? Wird Ihr Objekt dadurch zu einem Array? Es ist nur ein Fehler.
Bergi
@namuol: Außerdem würde dieser Ansatz erfordern, dass alle beteiligten Parteien (einschließlich der verwendeten Bibliotheken) zustimmen können, dass dies .array_zum Markieren von Arrays verwendet wird. Das ist hier wirklich nicht der Fall, .arraykann alles bedeuten. Sie sollten mindestens eine beschreibende Zeichenfolge verwenden und die Unangemessenheit einer willkürlichen Verwendung signalisieren, z .__isArray = true. B. mit .
Bergi
5

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:

if (typeof Array.isArray === "undefined") {
    Array.isArray = function (arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
    };
}

Übrigens, wenn Sie jQuery verwenden, können Sie die Methode $ .isArray () verwenden.

Salvador Dali
quelle
2
+1: warum nicht einfach if(!Array.isArray) {...?
Marco Demaio
5

Der einfachste und schnellste Weg, um zu überprüfen, ob ein Objekt ein Array ist oder nicht.

 var arr = [];
  arr.constructor.name ==='Array'  //return true;

oder

arr.constructor ===Array //return true;

oder Sie können eine Dienstprogrammfunktion erstellen:

function isArray(obj){ return obj && obj.constructor ===Array}

Verwendungszweck:

isArray(arr); //return true
sheelpriy
quelle
5

Folgendes kann verwendet werden, wenn Sie wissen, dass Ihr Objekt keine Concat-Methode hat.

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}

Ja
quelle
Dies ist ein guter Trick, könnte aber überschrieben werden ... aber meistens sollte das Ergebnis erzielt werden
Alireza
5

Sie könnten isArray-Methode, aber ich würde lieber mit überprüfen

Object.getPrototypeOf(yourvariable) === Array.prototype

STAHL
quelle
Warum würdest du das bevorzugen?
Mpen
@mpen Object.getPrototypeOf(yourvariable)gibt den Prototyp eines Array-Objekts zurück. Und der Code ist am schnellsten und sichersten.
Stahl
1
Es ist einfach zu folieren: pastebin.com/MP8d5bCE Haben Sie auch Leistungstests, um Ihre "schnellste" Behauptung zu sichern?
Mpen
4

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:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}
Tim Down
quelle
Ja ... das würde für dieses Szenario funktionieren, aber im Allgemeinen nicht. Ich habe sowieso Varargs benutzt. :)
Mpen
4
A = [1,2,3]
console.log(A.map==[].map)

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.

exebook
quelle
1
leichte Ableitung von mir, A.map !== undefinedaber ja, das könnte eine rutschige Straße in der Welt der Affen-Patcher sein;)
dmi3y
Zu Ihrer
Information
4
function isArray(value) {
    if (value) {
        if (typeof value === 'object') {
            return (Object.prototype.toString.call(value) == '[object Array]')
        }
    }
    return false;
}

var ar = ["ff","tt"]
alert(isArray(ar))
RoboTamer
quelle
4

Eine einfache Funktion zum Testen, ob ein Eingabewert ein Array ist, ist die folgende:

function isArray(value)
{
  return Object.prototype.toString.call(value) === '[object Array]';
}

Dies funktioniert browserübergreifend und mit älteren Browsern. Dies stammt aus dem Blog-Beitrag von TJ Crowders

Brad Parks
quelle
4

Sie können dies versuchen:

var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();

arr.constructor.prototype.hasOwnProperty('push') //true

obj.constructor.prototype.hasOwnProperty('push') // false
VIJAY P.
quelle
4

Diese Funktion verwandelt fast alles in ein Array:

function arr(x) {
    if(x === null || x === undefined) {
        return [];
    }
    if(Array.isArray(x)) {
        return x;
    }
    if(isString(x) || isNumber(x)) {
        return [x];
    }
    if(x[Symbol.iterator] !== undefined || x.length !== undefined) {
        return Array.from(x);
    }
    return [x];
}

function isString(x) {
    return Object.prototype.toString.call(x) === "[object String]"
}

function isNumber(x) {
    return Object.prototype.toString.call(x) === "[object Number]"
}

Es werden einige neuere Browserfunktionen verwendet, sodass Sie diese möglicherweise für maximale Unterstützung mehrfach ausfüllen möchten.

Beispiele:

> arr(null);
[]
> arr(undefined)
[]
> arr(3.14)
[ 3.14 ]
> arr(1/0)
[ Infinity ]
> gen = function*() { yield 1; yield 2; yield 3; }
[Function: gen]
> arr(gen())
[ 1, 2, 3 ]
> arr([4,5,6])
[ 4, 5, 6 ]
> arr("foo")
[ 'foo' ]

NB-Zeichenfolgen werden in ein Array mit einem einzelnen Element anstelle eines Arrays von Zeichen konvertiert. Löschen Sie den isStringScheck, wenn Sie ihn umgekehrt bevorzugen.

Ich habe Array.isArrayhier verwendet , weil es das robusteste und auch einfachste ist.

mpen
quelle
4

In Ihrem Fall können Sie eine Array-concat Methode verwenden, die sowohl einzelne Objekte als auch Arrays (und sogar kombinierte) akzeptieren kann:

function myFunc(stringOrArray)
{
  var arr = [].concat(stringOrArray);

  console.log(arr);

  arr.forEach(function(item, i)
  {
    console.log(i, "=", item);
  })
}

myFunc("one string");

myFunc(["one string", "second", "third"]);

concat scheint eine der ältesten Methoden von Array zu sein (selbst IE 5.5 weiß es gut).

kolyaseg
quelle