Comment vérifier si un objet est un tableau ?

J'essaie d'écrire une fonction qui accepte soit une liste de chaînes de caractères, soit une seule chaîne. S'il s'agit d'une chaîne, je veux la convertir en un tableau contenant un seul élément. Ainsi, je peux boucler dessus sans craindre une erreur.

Comment vérifier si la variable est un tableau ?


J'ai rassemblé les différentes solutions ci-dessous et créé un [jsperf test] (http://jsperf.com/js-isarray-comparison).

La méthode donnée dans la norme ECMAScript pour trouver la classe d'un objet est d'utiliser la méthode toString de Object.prototype.

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' );
}

Vous pouvez aussi utiliser typeof pour tester s'il s'agit d'une chaîne :

if( typeof someVar === 'string' ) {
    someVar = [ someVar ];
}

Si vous ne vous souciez pas des performances, vous pouvez simplement faire un concat vers un nouveau tableau vide.

someVar = [].concat( someVar );

Il y a aussi le constructeur que vous pouvez interroger directement :

if (somevar.constructor.name == "Array") {
    // do something
}

Consultez le [traitement approfondi][1] du blog de [@T.J. Crowder][2], tel que publié dans son commentaire ci-dessous.

Consultez ce [benchmark][3] pour vous faire une idée de la méthode la plus performante : http://jsben.ch/#/QgYAV

De [@Bharath][4] convertir une chaîne de caractères en tableau en utilisant Es6 pour la question posée :

const convertStringToArray = (object) => {
   return (typeof object === 'string') ? Array(object) : object 
}

supposez :

let m = 'bla'
let n = ['bla','Meow']
let y = convertStringToArray(m)
let z = convertStringToArray(n)
console.log('check y: '+JSON.stringify(y)) . // check y: ['bla']
console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']

[1] : http://blog.niftysnippets.org/2010/09/say-what.html [2] : https://stackoverflow.com/users/157247/t-j-crowder [3] : http://jsben.ch/#/QgYAV [4] : https://stackoverflow.com/users/8432239/bharath?tab=profile

Commentaires (29)

Je vérifierais d'abord si votre implémentation supporte isArray :

if (Array.isArray)
    return Array.isArray(v);

Vous pouvez aussi essayer d'utiliser l'opérateur instanceof.

v instanceof Array
Commentaires (11)

Si les deux seuls types de valeurs qui peuvent être passés à cette fonction sont une chaîne ou un tableau de chaînes, restez simple et utilisez un contrôle typeof pour la possibilité de chaîne :

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}
Commentaires (1)