J'essaie d'écrire une fonction qui accepte soit une liste de chaînes, soit une seule chaîne. Si c'est une chaîne, je veux la convertir en un tableau avec un seul élément, donc je peux la parcourir sans craindre une erreur.
Alors, comment puis-je vérifier si la variable est un tableau?
J'ai rassemblé les différentes solutions ci-dessous et créé un test jsperf . Ils sont tous rapides, il suffit donc de les utiliser Array.isArray
- ils sont désormais bien pris en charge et fonctionnent sur tous les cadres .
arr.constructor === Array
est le plus rapide.arr.constructor === Array
test retournera faux.Array.isArray(arr)
renvoie toujours vrai cependant.Réponses:
Dans les navigateurs modernes, vous pouvez le faire
( Pris en charge par Chrome 5, Firefox 4.0, IE 9, Opera 10.5 et Safari 5)
Pour des raisons de compatibilité descendante, vous pouvez ajouter les éléments suivants
Si vous utilisez jQuery, vous pouvez utiliser
jQuery.isArray(obj)
ou$.isArray(obj)
. Si vous utilisez un trait de soulignement, vous pouvez utiliser_.isArray(obj)
Si vous n'avez pas besoin de détecter les tableaux créés dans différents cadres, vous pouvez également simplement utiliser
instanceof
la source
Array.isArray
if (typeof Array.isArray === 'undefined') {
pourrait être changé enif(!Array.isArray) {
Object.prototype.string.call(obj)
peut être falsifié si l'objet aSymbol.toStringTag
dessus. Cela dit, je ne suis au courant d'aucun environnement expédié,Symbol.toStringTag
mais cela neArray.isArray
semble pas sûr.instanceof Array
échoue si le tableau provient d'une trame différente?instanceof Array
échoue si le tableau provient d'une trame différente car chaque tableau de cette trame différente a unArray
constructeur et un prototype différents. Pour des raisons de compatibilité / sécurité, chaque trame a son propre environnement global, et cela inclut les objets globaux. LeObject
global d'une trame est différent duObject
global d'un autre. De même pour lesArray
mondiaux. Axel Rauschmayer en parle davantage .La méthode donnée dans la norme ECMAScript pour trouver la classe d'Object est d'utiliser la
toString
méthode à partir deObject.prototype
.Ou vous pouvez utiliser
typeof
pour tester s'il s'agit d'une chaîne:Ou si vous n'êtes pas préoccupé par les performances, vous pouvez simplement faire un
concat
à un nouveau tableau vide.Il y a aussi le constructeur que vous pouvez interroger directement:
Découvrez un traitement approfondi sur le blog de @TJ Crowder , comme indiqué dans son commentaire ci-dessous.
Consultez cette référence pour avoir une idée de la méthode qui fonctionne le mieux: http://jsben.ch/#/QgYAV
De @Bharath, convertissez la chaîne en tableau en utilisant Es6 pour la question posée:
supposer:
la source
toString
est l'une des voies à suivre. Je fais un petit tour d' horizontypeof new String('beans')
> 'objet'Array.isArray(obj)
Je voudrais d'abord vérifier si votre implémentation prend en charge
isArray
:Vous pouvez également essayer d'utiliser l'
instanceof
opérateurla source
v instanceof Array
retournera false si av
été créé dans un autre cadre (v
est une instance dethatFrame.contentWindow.Array
classe).Array.isArray
est défini dans le cadre d'ECMAScript 5 / Javascript 1.8.5.return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
jQuery propose également une
$.isArray()
méthode:la source
$.isArray === Array.isArray
revient vrai.Array.isArray
les coulisses: github.com/jquery/jquery/blob/master/src/core.js#L211C'est la plus rapide de toutes les méthodes (tous les navigateurs pris en charge):
la source
if (obj && Array === obj.constructor)
par opposition àif (obj && obj.constructor === Array)
? Est-ce une perte de traduction en anglais, puis de coder? Par exemple, les anglophones ont généralement tendance à demander "l'objet existe-t-il et son constructeur provient-il de la classe array?", donc le flux de code lors de sa lecture est plus logique. ou y a-t-il une raison technique?function object_type(o){var t = typeof(o);return ((t==="object") && (o.constructor===Array)) ? "array" : t;} /*allows you to */ switch(object_type(o)){ case 'array': break; case 'object' : o.dosomething();}
Imaginez que vous avez ce tableau ci - dessous :
Javascript (nouveaux navigateurs et anciens):
ou
ou
puis appelez-le comme ceci:
Javascript (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)
jQuery:
Angulaire:
Souligner et Lodash:
la source
Array.isArray fonctionne rapidement, mais il n'est pas pris en charge par toutes les versions de navigateurs. Vous pouvez donc faire une exception pour les autres et utiliser la méthode universelle:
la source
.toString()
méthodeObject.prototype
. En ce moment, vous utilisez lewindow.toString()
, qui n'est pas le même.window.toString
faites la même chose queObject.prototype.toString
dans Chrome.Fonction simple pour vérifier cela:
la source
return object.constructor === Array
- mais êtes-vous sûr que cela ne reviendra que sur les tableaux?if(x) return true; else return false
:-) Même si c'est à l'envers, vous devez annuler l'expression.Comme MDN le dit ici :
Comme ça:
Object.prototype.toString.call(arr) === '[object Array]'
, ouArray.isArray(arr)
la source
Il n'y a qu'une solution de ligne pour cette question
où x est la variable, il retournera vrai si x est un tableau et faux s'il ne l'est pas.
la source
typeof
comparaison.{}
tableau, alors vous obtenez une erreur de syntaxe.Vous pouvez vérifier le type de votre variable s'il s'agit d'un tableau avec;
la source
instanceof
.. Je pense que cela échoue dans quelques scénarios étranges.Je ferais une fonction pour tester le type d'objet que vous traitez ...
alors vous pouvez écrire une simple instruction if ...
la source
Je le fais d'une manière très simple. Travaille pour moi. Des inconvénients?
la source
{isArray:true}
JSON.parse(someDataFromElsewhere).items.isArray
pourrait retourner vrai (selon les données) et casser votre code.C'est ma tentative d'améliorer cette réponse en tenant compte des commentaires:
Il supprime le if / else et explique la possibilité que le tableau soit nul ou non défini
la source
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray
la source
J'ai mis à jour le violon jsperf avec deux méthodes alternatives ainsi que la vérification des erreurs.
Il s'avère que la méthode définissant une valeur constante dans les prototypes «Objet» et «Tableau» est plus rapide que toutes les autres méthodes. C'est un résultat quelque peu surprenant.
Ces deux méthodes ne fonctionnent pas si la variable prend la valeur non définie, mais elles fonctionnent si vous êtes certain qu'elles ont une valeur. En ce qui concerne la vérification en tenant compte des performances si une valeur est un tableau ou une valeur unique, la deuxième méthode ressemble à une méthode rapide valide. Il est légèrement plus rapide que «instanceof» sur Chrome, deux fois plus rapide que la deuxième meilleure méthode dans Internet Explorer, Opera et Safari (sur ma machine).
la source
Je sais que les gens recherchent une sorte d'approche javascript brute. Mais si vous voulez y penser moins, jetez un œil ici: http://underscorejs.org/#isArray
Renvoie vrai si l'objet est un tableau.
la source
La meilleure solution que j'ai vue est un remplacement multi-navigateur pour typeof. Consultez la solution d'Angus Croll ici .
La version TL; DR est ci-dessous, mais l'article est une excellente discussion sur le problème, vous devriez donc le lire si vous en avez le temps.
la source
Voici mon approche paresseuse:
Je sais que c'est un sacrilège de "jouer avec" le prototype, mais il semble fonctionner beaucoup mieux que la
toString
méthode recommandée .Remarque: Un écueil de cette approche est qu'elle ne fonctionnera pas au-delà des
iframe
frontières , mais pour mon cas d'utilisation, ce n'est pas un problème.la source
wat = {array_: true}
objets.obj.array_ = true
, alors vous vous trompez seulement .cache
objet pour mémoriser les résultats de la recherche qui utilise les chaînes de recherche comme clés de propriété. Et si un utilisateur recherchearray_
? Votre objet devient-il un tableau à cause de cela? C'est juste un bug..array_
est utilisé pour le balisage des tableaux. Ce n'est vraiment pas le cas ici, cela.array
peut signifier quelque chose. Vous devez au moins utiliser une chaîne descriptive et signaler le caractère inapproprié d'une utilisation arbitraire, par exemple avec.__isArray = true
.Il y a un bel exemple dans le livre JavaScript Patterns de Stoyan Stefanov qui suppose de gérer tous les problèmes possibles ainsi que d'utiliser la méthode ECMAScript 5 Array.isArray () .
Voici donc:
Par ailleurs, si vous utilisez jQuery, vous pouvez utiliser sa méthode $ .isArray ()
la source
if(!Array.isArray) {...
?moyen le plus simple et le plus rapide de vérifier si un objet est un tableau ou non.
ou
ou vous pouvez créer une fonction utilitaire:
usage:
la source
Ce qui suit peut être utilisé si vous savez que votre objet n'a pas de méthode concat.
la source
Vous pourriez est la méthode isArray mais je préférerais vérifier avec
Object.getPrototypeOf(yourvariable) === Array.prototype
la source
Object.getPrototypeOf(yourvariable)
retourne le prototype d'un objet Array. Et le code est le plus rapide et le plus sûr.Si les deux seuls types de valeurs pouvant être passés à cette fonction sont une chaîne ou un tableau de chaînes, restez simple et utilisez une
typeof
vérification de la possibilité de chaîne:la source
À la recherche de la version la plus courte, voici ce que j'ai obtenu jusqu'à présent.
Notez qu'il n'y a pas de fonction parfaite qui détectera toujours toutes les combinaisons possibles. Il vaut mieux connaître toutes les capacités et les limites de vos outils que d'attendre un outil magique.
la source
A.map !== undefined
mais oui, cela pourrait être une route glissante dans le monde desla source
Une fonction simple pour tester si une valeur d'entrée est un tableau est la suivante:
Cela fonctionne sur plusieurs navigateurs et avec des navigateurs plus anciens. Ceci est tiré du blog de TJ Crowders
la source
Vous pouvez essayer ceci:
la source
Cette fonction transformera presque n'importe quoi en tableau:
Il utilise des fonctionnalités de navigateur plus récentes, vous voudrez donc peut-être les remplir pour une prise en charge maximale.
Exemples:
NB les chaînes seront converties en un tableau avec un seul élément au lieu d'un tableau de caractères. Supprimez la
isString
coche si vous préférez l'inverse.Je l'ai utilisé
Array.isArray
ici parce que c'est le plus robuste et aussi le plus simple.la source
Dans votre cas, vous pouvez utiliser la
concat
méthode Array qui peut accepter des objets uniques ainsi que des tableaux (et même combinés):concat
semble être l'une des plus anciennes méthodes d'Array (même IE 5.5 le sait bien).la source