88 votes

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

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 l'objet ressemble à {"0":"string","1":"string","length":"2"} mais je ne veux pas qu'il apparaisse comme un tableau si c'est en fait un objet ressemblant à un tableau.

JSON.parse y JSON.stringify sont capables de faire cette distinction. Comment puis-je le faire ?

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

166voto

Raynos Points 82706
  • Array.isArray

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

  • arr instanceof Array

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

Une méthode de l'underscore. Voici un extrait 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 méthode Object.prototype.toString sur celui-ci. Cette méthode renverra toujours [object Array] pour les tableaux.

D'après mon expérience personnelle, je trouve que demander à la toString est la plus efficace mais elle n'est pas aussi courte ou lisible que la méthode instanceof Array Il n'est pas non plus aussi rapide que Array.isArray mais c'est du code ES5 et j'ai tendance à éviter de l'utiliser pour la portabilité.

Je vous recommande personnellement d'essayer d'utiliser underscore qui est une bibliothèque contenant des méthodes utilitaires communes. Elle contient de nombreuses fonctions utiles qui permettent d'assécher votre code.

72voto

T-Bull Points 1136

Essayez ce code :

Array.isArray(argument)

8voto

t.dubrownik Points 1874

Pourquoi pas :

your_object instanceof Array

En V8 dans Chrome, j'obtiens

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

7voto

Tom Points 7654

Il semble que cette question ait plusieurs bonnes réponses, mais pour être complet, je voudrais ajouter une autre option, qui n'a pas été suggérée auparavant.

Afin de vérifier si quelque chose est un tableau, vous pouvez utiliser Node.js util et son module natif isArray() 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 mises en œuvre par V8, car elle affichera toujours la bonne réponse.

0voto

Jacky Points 442

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X