web-dev-qa-db-fra.com

JavaScript: détecter si l'argument est un tableau plutôt qu'un objet (Node.JS)

Comment devrais-je détecter si l'argument est un tableau parce que typeof [] renvoie 'object' et que je souhaite faire la distinction entre des tableaux et des objets.

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

JSON.parse et JSON.stringify peuvent faire cette distinction. Comment puis-je le faire?

J'utilise Node.JS, qui est basé sur V8 et identique à Chrome.

74
George Bailey
  • 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 tiré de la 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 méthode Object.prototype.toString dessus. Cela retournera toujours [object Array] pour les tableaux.

D'après mon expérience personnelle, demander la méthode toString est la méthode la plus efficace, mais elle n'est pas aussi courte et lisible que instanceof Array et n'est pas aussi rapide que Array.isArray.

Personnellement, je vous recommande d’essayer d’utiliser underscore , qui est une bibliothèque contenant des méthodes d’utilité communes. Il a beaucoup de fonctions utiles qui DRY améliorent votre code.

152
Raynos

Essayez ce code:

Array.isArray(argument)
56
T-Bull

Il me semble que cette question a plusieurs bonnes réponses, mais pour être complet, j’ajouterais une autre option, qui n’a pas été suggérée plus tôt. 

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

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’aurez plus à vous soucier des normes JS mises en œuvre par V8 car elles indiqueront toujours la bonne réponse.

7
Tom

Que diriez-vous:

your_object instanceof Array

En V8 en Chrome je reçois

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

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

0
Jacky