Vérifier si l'objet est ensemble?

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, alors je veux le convertir en un tableau avec juste un élément. Alors je peux le boucler sans crainte d'erreur.

alors comment vérifier si la variable est un tableau?


j'ai rassemblé les différentes solutions ci-dessous et j'ai créé un test jsperf .

2219
demandé sur mpen 2011-01-23 21:53:04
la source

30 ответов

dans les navigateurs modernes, vous pouvez faire

Array.isArray(obj)

( supporté par Chrome 5, Firefox 4.0, IE 9, Opera 10.5 et Safari 5)

pour la compatibilité ascendante, vous pouvez ajouter le suivant

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

si vous utilisez jQuery vous pouvez utiliser jQuery.isArray(obj) ou $.isArray(obj) . Si vous utilisez underscore vous pouvez utiliser _.isArray(obj)

si vous n'avez pas besoin de détecter des tableaux créés dans différents vous pouvez également utiliser instanceof

obj instanceof Array
410
répondu Fela Winkelmolen 2014-11-21 00:16:00
la source

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

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

ou vous pouvez utiliser typeof pour tester si c'est une chaîne de caractères:

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

ou si vous n'êtes pas concerné par la performance, vous pouvez simplement faire un concat à 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
}

Check out traitement complet à partir de @T. J. Crowder blog, comme publié dans son commentaire ci-dessous.

découvrez ce de référence", 1519220920" pour avoir une idée de la méthode la plus performante: http://jsben.ch/#/QgYAV

à Partir de @Bharath convertit une chaîne en tableau à l'aide de Es6 pour la question posée:

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

supposons que:

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']
1875
répondu user113716 2018-03-01 02:30:09
la source

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

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

vous pouvez également essayer d'utiliser l'opérateur instanceof 151950920"

v instanceof Array
1228
répondu ChaosPandion 2011-01-23 21:55:46
la source

jQuery offre également une $.isArray() méthode:

var a = ["A", "AA", "AAA"];

if($.isArray(a)) {
  alert("a is an array!");
} else {
  alert("a is not an array!");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
284
répondu janr 2016-08-17 10:41:25
la source

C'est la plus rapide de toutes les méthodes (tous les navigateurs pris en charge):

function isArray(obj){
    return !!obj && obj.constructor === Array;
}
90
répondu shinobi 2017-02-19 11:37:44
la source

Imaginez que vous ayez ce tableau ci-dessous:

var arr = [1,2,3,4,5];

Javascript (nouveaux et anciens navigateurs):

function isArray(arr) {
  return arr.constructor.toString().indexOf("Array") > -1;
}

ou

function isArray(arr) {
  return arr instanceof Array;
}

ou

function isArray(arr) {
  return Object.prototype.toString.call(arr) === '[object Array]';
}

alors appelez-le comme ceci:

isArray(arr);

Javascript (IE9+, Ch5+, FF4+, Saf5+, Opera10.5+)

Array.isArray(arr);

jQuery:

$.isArray(arr);

Angulaire:

angular.isArray(arr);

Underscore et Lodash:

_.isArray(arr);
35
répondu Alireza 2018-05-17 05:44:52
la source

tableau.isArray fonctionne rapidement, mais il n'est pas pris en charge par toutes les versions de navigateurs. Ainsi, vous pouvez faire une exception pour les autres et utiliser la méthode universelle:

    Utils = {};    
    Utils.isArray = ('isArray' in Array) ? 
        Array.isArray : 
        function (value) {
            return Object.prototype.toString.call(value) === '[object Array]';
        }
31
répondu CruorVult 2013-02-18 15:18:11
la source

simple fonction pour vérifier ceci:

function isArray(object)
{
    if (object.constructor === Array) return true;
    else return false;
}
20
répondu MidnightTortoise 2012-09-04 21:56:10
la source

vous pouvez essayer cette approche: http://web.archive.org/web/20100424091244/http://www.ajaxdr.com/code/javascript-version-of-phps-is_array-function/

EDIT : aussi, si vous utilisez déjà JQuery dans votre projet, vous pouvez utiliser sa fonction $.isArray () .

16
répondu André Paramés 2012-06-14 15:06:21
la source

comme dit MDN ici :

utiliser tableau.objet isArray ou .prototype.toString.appeler pour différencier objets réguliers des tableaux

comme ceci:

  • Object.prototype.toString.call(arr) === '[object Array]' , ou

  • Array.isArray(arr)

13
répondu ajax333221 2012-09-15 01:02:15
la source

vous pouvez vérifier le type de votre variable si elle est un tableau avec;

var myArray=[];

if(myArray instanceof Array)
{
....
}
12
répondu Ahmet DAL 2013-01-15 12:58:07
la source

je ferais une fonction pour tester le type d'objet avec lequel vous traitez...

function whatAmI(me){ return Object.prototype.toString.call(me).split(/\W/)[2]; }

// tests
console.log(
  whatAmI(["aiming","@"]),
  whatAmI({living:4,breathing:4}),
  whatAmI(function(ing){ return ing+" to the global window" }),
  whatAmI("going to do with you?")
);

// output: Array Object Function String

alors vous pouvez écrire un simple if statement...

if(whatAmI(myVar) === "Array"){
    // do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
    // do string stuff
}
12
répondu Billy Moon 2016-08-17 10:46:17
la source

il n'y a qu'une seule solution pour cette question

x instanceof Array

où x est la variable elle retournera true si x est un tableau, et false si elle ne l'est pas.

11
répondu Vikash Kumar 2017-06-08 15:48:15
la source

je le fais d'une manière très simple. Fonctionne pour moi. - Il des inconvénients?

Array.prototype.isArray = true;

a=[]; b={};
a.isArray  // true
b.isArray  // (undefined -> false)
10
répondu rsbkk 2015-04-04 09:58:20
la source

C'est ma tentative d'amélioration cette réponse en prenant en compte les commentaires:

var isArray = myArray && myArray.constructor === Array;

il se débarrasse du SI / else, et rend compte de la possibilité que le tableau soit nul ou non défini

10
répondu George Jempty 2017-05-23 15:34:51
la source

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray

Array.isArray = Array.isArray || function (vArg) {
    return Object.prototype.toString.call(vArg) === "[object Array]";
};
9
répondu Safareli 2013-04-01 09:32:31
la source

j'ai mis à jour le jsperf fiddle 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 'Object' et 'Array' est plus rapide que n'importe laquelle des autres méthodes. C'est un peu surprenant résultat.

/* Initialisation */
Object.prototype.isArray = function() {
  return false;
};
Array.prototype.isArray = function() {
  return true;
};
Object.prototype._isArray = false;
Array.prototype._isArray = true;

var arr = ["1", "2"];
var noarr = "1";

/* Method 1 (function) */
if (arr.isArray()) document.write("arr is an array according to function<br/>");
if (!noarr.isArray()) document.write("noarr is not an array according to function<br/>");
/* Method 2 (value) - **** FASTEST ***** */
if (arr._isArray) document.write("arr is an array according to member value<br/>");
if (!noarr._isArray) document.write("noarr is not an array according to member value<br/>");

ces deux méthodes ne fonctionnent pas si la variable prend la valeur non définie, mais elles fonctionnent si vous sont certains qu'ils ont une valeur. En ce qui concerne la vérification avec la performance à l'esprit si une valeur est un tableau ou une valeur simple, 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).

9
répondu le_top 2015-08-01 14:10:28
la source

je sais, que les gens sont à la recherche d'une sorte d'approche javascript brute. Mais si vous voulez penser moins, jetez un oeil ici: http://underscorejs.org/#isArray

_.isArray(object) 

retourne true si l'objet est un tableau.

(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true
8
répondu Eugene 2015-09-28 16:27:56
la source

la meilleure solution que j'ai vu est un remplacement de navigateur pour typeof. Vérifiez la solution D'Angus Croll ici .

Le TL;DR version est en dessous, mais l'article est un grand débat de la question de sorte que vous devriez lire si vous avez le temps.

Object.toType = function(obj) {
    return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
}
// ... and usage:
Object.toType([1,2,3]); //"array" (all browsers)

// or to test...
var shouldBeAnArray = [1,2,3];
if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};
5
répondu John Wundes 2012-03-23 21:16:43
la source

Voici mon approche paresseuse:

if (Array.prototype.array_ === undefined) {
  Array.prototype.array_ = true;
}

// ...

var test = [],
    wat = {};

console.log(test.array_ === true); // true
console.log(wat.array_ === true);  // false

je sais que c'est un sacrilège de" faire foirer "le prototype, mais il semble donner de meilleurs résultats que la méthode recommandée toString 151970920" .

Note: l'un des écueils de cette approche est qu'elle ne fonctionne pas à travers iframe limites , mais pour mon cas d'utilisation ce n'est pas un problème.

5
répondu namuol 2013-12-06 06:07:47
la source

il y a un bel exemple dans le livre de Stoyan Stefanov motifs JavaScript qui suppose de traiter tous les problèmes possibles ainsi que d'utiliser la méthode ECMAScript 5 tableau.isArray () .

alors voilà:

if (typeof Array.isArray === "undefined") {
    Array.isArray = function (arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
    };
}

soit dit en passant, si vous utilisez jQuery, vous pouvez utiliser sa méthode $.isArray ()

5
répondu Salvador Dali 2013-12-17 02:27:21
la source

vous pouvez utiliser la méthode isArray mais je préfère vérifier avec

Object.getPrototypeOf(yourvariable) === Array.prototype

5
répondu STEEL 2018-02-28 20:21:06
la source

si les deux seuls types de valeurs qui pourraient être passées à cette fonction sont une chaîne ou un tableau de chaînes, garder simple et utiliser un typeof vérifier la possibilité de chaîne:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}
4
répondu Tim Down 2011-01-23 22:51:12
la source
function isArray(value) {
    if (value) {
        if (typeof value === 'object') {
            return (Object.prototype.toString.call(value) == '[object Array]')
        }
    }
    return false;
}

var ar = ["ff","tt"]
alert(isArray(ar))
4
répondu RoboTamer 2013-10-30 13:56:27
la source

Une fonction simple pour tester si une valeur d'entrée est un tableau est la suivante:

function isArray(value)
{
  return Object.prototype.toString.call(value) === '[object Array]';
}

cela fonctionne à travers le navigateur, et avec les navigateurs plus anciens. C'est tiré du blog de T. J. Crowders

4
répondu Brad Parks 2014-02-02 04:29:54
la source

cette fonction transformera presque n'importe quoi en tableau:

function arr(x) {
    if(x === null || x === undefined) {
        return [];
    }
    if(Array.isArray(x)) {
        return x;
    }
    if(isString(x) || isNumber(x)) {
        return [x];
    }
    if(x[Symbol.iterator] !== undefined || x.length !== undefined) {
        return Array.from(x);
    }
    return [x];
}

function isString(x) {
    return Object.prototype.toString.call(x) === "[object String]"
}

function isNumber(x) {
    return Object.prototype.toString.call(x) === "[object Number]"
}

il utilise quelques nouvelles fonctionnalités de navigateur de sorte que vous pouvez vouloir polyfill ce pour un soutien maximum.

exemples:

> arr(null);
[]
> arr(undefined)
[]
> arr(3.14)
[ 3.14 ]
> arr(1/0)
[ Infinity ]
> gen = function*() { yield 1; yield 2; yield 3; }
[Function: gen]
> arr(gen())
[ 1, 2, 3 ]
> arr([4,5,6])
[ 4, 5, 6 ]
> arr("foo")
[ 'foo' ]

N.B. les chaînes seront converties en un tableau avec un seul élément au lieu d'un tableau de caractères. Supprimez la vérification isString si vous préférez l'inverse.

j'ai utilisé Array.isArray ici parce que c'est le le plus robuste et aussi le plus simple.

4
répondu mpen 2016-10-24 19:01:37
la source

la façon la plus facile et la plus rapide de vérifier si un objet est un tableau ou non.

 var arr = [];
  arr.constructor.name ==='Array'  //return true;

ou

arr.constructor ===Array //return true;

ou vous pouvez faire une fonction utilitaire:

function isArray(obj){ return obj && obj.constructor ===Array}

utilisation:

isArray(arr); //return true
4
répondu sheelpriy 2017-03-29 09:25:02
la source

pourrait être utilisé si vous savez que votre objet n'a pas une méthode concat.

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}
4
répondu yesil 2017-04-26 10:00:00
la source
A = [1,2,3]
console.log(A.map==[].map)

à la recherche de la version la plus courte voici ce que j'ai obtenu jusqu'à présent.

Note, il n'y a pas de fonction parfaite qui détecte toujours toutes les combinaisons possibles. il est préférable de connaître toutes les capacités et limites de vos outils que de s'attendre à un outil magique.

3
répondu exebook 2013-03-12 06:57:43
la source

Vous pouvez essayer ceci:

var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();

arr.constructor.prototype.hasOwnProperty('push') //true

obj.constructor.prototype.hasOwnProperty('push') // false
3
répondu VVL 2016-02-25 18:54:37
la source

Autres questions sur javascript arrays