it-swarm.com.de

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

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

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

JSON.parse und JSON.stringify können diese Unterscheidung treffen. Wie kann ich es tun?

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

74
George Bailey
  • _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 der 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 Methode _Object.prototype.toString_ auf. Dies gibt für Arrays immer _[object Array]_ zurück.

Nach meiner persönlichen Erfahrung ist es am effektivsten, nach der Methode toStringzu fragen, aber sie ist nicht so kurz oder lesbar wie _instanceof Array_ und auch nicht so schnell wie _Array.isArray_, aber das ist ES5-Code, und ich vermeide es, sie zu verwenden Portabilität.

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

158
Raynos

Versuchen Sie diesen Code:

Array.isArray(argument)
56
T-Bull

Ich denke, diese Frage hat mehrere gute Antworten, aber der Vollständigkeit halber möchte ich noch eine Option hinzufügen, die zuvor nicht vorgeschlagen wurde. 

Um zu überprüfen, ob etwas ein Array ist, können Sie das native Modul Node.js util und seine Funktion isArray() verwenden.

Beispiel:

var util = require('util');

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

Bei dieser Methode müssen Sie sich keine Sorgen um die von V8 implementierten JS-Standards machen, da sie immer die richtige Antwort zeigen.

7
Tom

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
t.dubrownik

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

0
Jacky