JavaScript: Ermitteln Sie, ob das Argument ein Array anstelle eines Objekts ist (Node.JS).


86

Wie soll ich feststellen, ob das Argument ein Array ist, weil typeof []zurückgegeben wird 'object'und ich zwischen Arrays und Objekten unterscheiden möchte?

Es ist möglich, dass das Objekt so aussieht, {"0":"string","1":"string","length":"2"}aber ich möchte nicht, dass es als Array angezeigt wird, wenn es tatsächlich ein Objekt ist, das wie ein Array aussieht.

JSON.parseund JSON.stringifysind in der Lage, diese Unterscheidung zu treffen. Wie kann ich es tun?

Ich verwende Node.JS, das auf V8 basiert, genauso wie Chrome.

Antworten:


162
  • Array.isArray

native V8-Funktion. Es ist schnell, es ist immer richtig. Dies ist Teil von ES5.

  • arr instanceof Array

Überprüft, ob das Objekt mit dem Array-Konstruktor erstellt wurde.

Eine Methode aus dem Unterstrich. Hier ist ein Ausschnitt aus ihrer Quelle

var toString = Object.prototype.toString,
    nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
};

Diese Methode nimmt ein Objekt und ruft die Object.prototype.toStringMethode darauf auf. Dies wird immer [object Array]für Arrays zurückgegeben.

Nach meiner persönlichen Erfahrung toStringist es am effektivsten, nach der Methode zu fragen, aber sie ist nicht so kurz oder lesbar wie instanceof Arraynoch so schnell wie, Array.isArrayaber das ist ES5-Code, und ich vermeide es, sie für die Portabilität zu verwenden.

Ich würde Ihnen persönlich empfehlen underscore, eine Bibliothek mit gängigen Dienstprogrammmethoden zu verwenden. Es hat viele nützliche Funktionen, die Ihren Code austrocknen.


1
Verwenden Sie die utilBibliothek node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof

5
sanfte Erinnerung, benötigen wir nicht ('util'). isArray (arr) in Knoten v4.00 und höher. Es ist veraltet
Sunil Khiatani

In Node 10.x sieht es irgendwie so aus, als ob es arr instanceof Arrayfehlschlägt. Das Array.isArray()funktioniert aber super.
Alexis Wilke

69

Versuchen Sie diesen Code:

Array.isArray(argument)

8

Wie wäre es mit:

your_object instanceof Array

In V8 in Chrome bekomme ich

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false

7

Ich sehe so aus, als hätte diese Frage mehrere gute Antworten, aber der Vollständigkeit halber würde ich eine weitere Option hinzufügen, die zuvor nicht vorgeschlagen wurde.

Um zu überprüfen, ob es sich bei einem Array um ein Array handelt, können Sie das utilnative Modul von Node.j und seine isArray()Funktion verwenden.

Beispiel:

var util = require('util');

util.isArray([]);  // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false

Mit dieser Methode müssen Sie sich keine Gedanken über die von V8 implementierten JS-Standards machen, da immer die richtige Antwort angezeigt wird.


5
FWIW, util.isArray()derzeit Proxies an Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer

0

Versuchen Sie
Folgendes : console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.