web-dev-qa-db-fra.com

Comment vérifier si un objet n'est pas un tableau?

J'ai donc une fonction qui doit vérifier si un argument est un objet, mais cela échoue parce que:

typeof [] // returns 'object'

C'est un javascript classique, mais je ne me souviens plus quoi faire pour accepter des objets, mais pas des tableaux.

30
hojberg

Essayez quelque chose comme ça:

obj.constructor.toString().indexOf("Array") != -1

ou (encore mieux)

obj instanceof Array
38
Tomas Vana

Toutes ces réponses suggérant de vérifier (d'une manière ou d'une autre) si un objet est une instance de la classe "Array" (c'est-à-dire construite par "Array") ne sont vraiment pas des solutions sûres. Ils fonctionneront parfois, peut-être la plupart du temps, mais tous les principaux cadres se sont éloignés de cette approche. L’un des principaux problèmes est qu’il existe une interaction entre plusieurs fenêtres (généralement une fenêtre parent et une ou plusieurs fenêtres frame ou iframe). Si vous transmettez un objet de tableau créé dans une fenêtre à une API résidant dans une autre fenêtre, tous ces tests échoueront. Pourquoi? Ce que vous testez, c'est si un objet est une instance de la classe "Array" dans le contexte de votre fenêtre locale. En d'autres termes, lorsque vous faites référence à "Array" dans

if (myobject instanceof Array) { ... }

ce que vous référencez est bien sûr window.Array. Eh bien, un tableau construit dans une autre fenêtre est not va être une instance de la classe Array dans votre fenêtre!

Vérifier le nom du constructeur est probablement un peu plus sûr, même si cela reste risqué. À mon avis, vous feriez mieux de choisir une méthode de frappe au canard. C'est-à-dire, au lieu de demander: "Est-ce un tableau?" demandez plutôt: "cet objet semble-t-il prendre en charge un ensemble particulier d'API Array dont j'ai besoin dans cette situation?" Par exemple, "cet objet a-t-il une propriété length?" Javascript est un joli langage "mou", et à peu près tout est modifiable. Ainsi, même si vous découvrez que quelque chose a été construit par "Array", vous encore ne savez vraiment pas vraiment ce que vous pouvez faire avec ou non.

[edit] Merci pour ce lien, @Lachlan - voici une description très claire des problèmes: http://juhukinners.com/2009/01/11/typeof-considered-useless-or-how-towwrite- contrôles de type robustes/

20
Pointy

Pour déterminer si un objet donné est un tableau, ECMAScript 5 introduit la méthode Array.isArray () , actuellement prise en charge par tous les navigateurs modernes. Reportez-vous à ce tableau de compatibilité ECMAScript .

Pour déterminer la classe d'un objet particulier, vous pouvez utiliser la méthode Object.prototype.toString () .

Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"

9
arley

Pour tester si quelque chose est une instance d'un Array :

const arr = [1,2,3];
Array.isArray(arr);  // true

Pour tester est quelque chose est une instance d'un Object :

const obj = { 1: 'a', 2: 'b', 3: 'c' };
obj.constructor === Object;  // true

Note Ce dernier génère une erreur si obj est null ou undefined, dans ce cas, vous pouvez utiliser: typeof obj === 'object' ou simplement effectuer une vérification nulle: obj && obj.constructor === Object.

6
IliasT

Après tout, les tableaux sont des objets en javascript. Il suffit donc de vérifier si le type de variable est un objet et en même temps, cet objet n'est pas une instance de la classe Array. 

var obj = {fname:'John',lname:'Doe'};

if(typeof obj === 'object' && !(obj instanceof Array)){
  return true ;
} else  {
  return false;
}
5
Hyyan Abo Fakher

Voici comment jQuery vérifie si quelque chose est un tableau:

isArray: function( arr ) {
    return !!arr && arr.constructor == Array;
}

Mais, cet article recommande de le faire comme ceci:

function isArray(o) {
    return Object.prototype.toString.call(o) === '[object Array]';
}
4
Andrew Hedges

Avez-vous essayé ceci:

var test = [];
if(test instanceof Array) {
 ...
}

EDIT: Cette méthode ne fonctionne pas dans les environnements DOM multi-images ( 'typeof' considéré comme inutile - ou comment écrire des contrôles de type robustes ). (via Pointy _)

2
Arnold Zokas

veuillez utiliser Object.prototype.toString.call({}).slice(8,-1)==="Object". Cela fonctionne pour tous les types de données. Vous pouvez remplacer le paramètre dans la fonction d’appel et la comparaison afin de rechercher différents types de données. ça marche aussi pour le chèque nul 

0
Joey Dias

vous pouvez aller chercher 

if(refernce_name instanceOf Object[])
{ 
 ...
}
0
Shivam

var obj = {first: 'Stack', last: 'Overflow'};
// var obj = ['Stack', 'overflow']; //You can uncomment this line and comment the above to check..

if(Object.prototype.toString.call(obj) !== '[object Array]') {
    //your code..
    var str = '';
    for(var k in obj) {
    	str = str + obj[k] + ' ';
    }
    console.log('I love ', str);
    alert('I love ' + str);
} else {
	console.log('Could not process. Probably an array');
  alert('Could not process. Probably an array');
}

console.log('Length is: ', Object.keys(obj).length);
alert('Length is: ' + Object.keys(obj).length);

Soit input un Array ou un Object

Pour vérifier si un objet est une Array
if(Object.prototype.toString.call(input) === '[object Array]') {}

Pour vérifier si un objet est une Object
if(Object.prototype.toString.call(input) === '[object Object]') {}


Veuillez noter que Object.keys(input).length vous renverra la longueur pour Array et Object.

JS Fiddle exemple pour le même

0
Anish Nair

Regardez ce paquet

Vérifier si un objet donné n'est pas un tableau pour les anciens navigateurs

https://www.npmjs.com/package/notisarray

0
JoeLoco