JavaScript: détecter si l'argument est un tableau au lieu d'un objet (Node.JS)

87

Comment dois-je détecter si l'argument est un tableau car typeof []renvoie 'object'et je veux faire la distinction entre les tableaux et les objets.

Il est possible que cet objet ressemble, {"0":"string","1":"string","length":"2"}mais je ne veux pas qu'il apparaisse sous forme de tableau s'il s'agit en fait d'un objet ressemblant à un tableau.

JSON.parseet JSON.stringifysont capables de faire cette distinction. Comment puis-je le faire?

J'utilise Node.JS qui est basé sur V8 comme Chrome.

Champ Bryan
la source

Réponses:

164
  • Array.isArray

fonction V8 native. C'est rapide, c'est toujours correct. Cela fait partie de ES5.

  • arr instanceof Array

Vérifie si l'objet a été créé avec le constructeur de tableau.

Une méthode de soulignement. Voici un extrait de leur source

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

Cette méthode prend un objet et appelle la Object.prototype.toStringméthode dessus. Cela reviendra toujours [object Array]pour les tableaux.

Dans mon expérience personnelle, je trouve que demander la toStringméthode est la plus efficace, mais ce n'est pas aussi court ou lisible, instanceof Arrayni aussi rapide que Array.isArraymais c'est du code ES5 et j'ai tendance à éviter de l'utiliser pour la portabilité.

Je vous recommanderais personnellement d'essayer d'utiliser underscore, qui est une bibliothèque contenant des méthodes utilitaires courantes. Il a beaucoup de fonctions utiles qui SÈCHENT votre code.

Raynos
la source
1
Utilisez la utilbibliothèque node.js - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof
5
petit rappel, nous n'avons pas besoin ('util'). isArray (arr) dans le nœud v4.00 et supérieur C'est obsolète
Sunil Khiatani
D'une manière ou d'une autre, dans Node 10.x, cela semble arr instanceof Arrayéchouer. Cependant, cela Array.isArray()fonctionne très bien.
Alexis Wilke
71

Essayez ce code:

Array.isArray(argument)
T-Bull
la source
8

Que diriez-vous:

your_object instanceof Array

Dans V8 dans Chrome, je reçois

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false
t.dubrownik
la source
7

Il me semble que cette question a plusieurs bonnes réponses, mais par souci d'exhaustivité, j'ajouterais une autre option, qui n'a pas été suggérée précédemment.

Afin de vérifier si quelque chose est un tableau, vous pouvez utiliser utille module natif Node.js et sonisArray() fonction.

Exemple:

var util = require('util');

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

Avec cette méthode, vous n'avez pas à vous soucier des normes JS implémentées par V8 car elle affichera toujours la bonne réponse.

À M
la source
5
FWIW, util.isArray()actuellement proxy vers Array.isArray(): github.com/joyent/node/blob/…
Tom Spencer
0

Essayez de cette façon:
console.log (Object.prototype.toString.call (arg) .replace (/ ^ [object (. +)] $ /, '$ 1'). ToLowerCase ())

LiangWang
la source