Après une demande AJAX, mon application peut parfois renvoyer un objet vide, comme:
var a = {};
Comment puis-je vérifier si c'est le cas?
Après une demande AJAX, mon application peut parfois renvoyer un objet vide, comme:
var a = {};
Comment puis-je vérifier si c'est le cas?
if( Object.entries(a).length > 0){ //do }
Réponses:
ECMA 5+ :
Notez cependant que cela crée un tableau inutile (la valeur de retour de
keys
).Pré-ECMA 5:
jQuery :
lodash :
Souligner :
Hoek
ExtJS
AngularJS (version 1)
Ramda
la source
Object.keys(new Date()).length === 0
; donc cette réponse peut être trompeuse.(new Date()).constructor === Date
, ou inversement,({}).constructor === Object
.Object.keys()
ne vérifie pas les propriétés non énumérables ou les symboles. Vous devez utiliserObject.getOwnPropertyNames()
et à laObject.getOwnPropertySymbols()
place. C'est égalementObject.getPrototypeOf()
la bonne façon d'obtenir le prototype d'un objet.obj.constructor
peut être facilement forgé. Exemple:function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
.Il n'y a pas de moyen facile de le faire. Vous devrez parcourir les propriétés explicitement:
Si la prise en charge d' ECMAScript 5 est disponible, vous pouvez utiliser à la
Object.keys()
place:la source
isEmpty()
, donc elle devrait retournerfalse
si elle a une propriétéPour ceux d'entre vous qui ont le même problème mais utilisent jQuery, vous pouvez utiliser jQuery.isEmptyObject .
la source
underscore.js
...Ceci est ma solution préférée:
la source
Object.keys(new Date()).length === 0
; donc cette réponse peut être trompeuse.new Date()
n'est pas un objet.nd = new Date(); nd.constructor === Object;
résulte enfalse
.Vous pouvez utiliser Underscore.js .
la source
voir http://bencollier.net/2011/04/javascript-is-an-object-empty/
la source
Object.getOwnPropertyNames(new Date()).length === 0
; donc cette réponse peut être trompeuse.Que diriez-vous d'utiliser JSON.stringify? Il est presque disponible dans tous les navigateurs modernes.
la source
Je viens de rencontrer une situation similaire. Je ne voulais pas utiliser JQuery et je voulais le faire en utilisant du Javascript pur.
Et ce que j'ai fait, c'est utiliser la condition suivante, et cela a fonctionné pour moi.
Pour différent de, utilisez ceci:
JSON.stringify(obj) !== '{}'
Découvrez ce JSFiddle
la source
Vieille question, mais vient d'avoir le problème. Inclure JQuery n'est pas vraiment une bonne idée si votre seul but est de vérifier si l'objet n'est pas vide. Au lieu de cela, juste profondément dans le code de JQuery , et vous obtiendrez la réponse:
la source
Il existe un moyen simple si vous utilisez un navigateur plus récent.
Object.keys(obj).length == 0
la source
keys
propriété?Object.keys
c'est une méthode standard mais les objets n'ont pas de propriété keys. Donc, ce code signalera tout objet comme vide, sauf qu'il se trouve accidentellement qu'une propriété est nomméekey
avec une valeur qui, à nouveau, comme une propriété nomméelength
qui n'est pas nulle. Horrible!Object.keys(new Date()).length === 0
; donc cette réponse peut être trompeuse.Performance
Aujourd'hui 2020.01.17 j'effectue des tests sur MacOs HighSierra 10.13.6 sur Chrome v79.0, Safari v13.0.4 et Firefox v72.0, pour les solutions choisies.
Conclusions
for-in
(A, J, L, M) sont les plus rapidesJSON.stringify
(B, K) sont lentesObject
(N) est lenteDétails
Ci-dessous en extrait sont présentées 15 solutions. Si vous souhaitez exécuter un test de performances sur votre machine, cliquez sur ICI .
Afficher l'extrait de code
la source
L'utilisation d'Object.keys (obj) .length (comme suggéré ci-dessus pour ECMA 5+) est 10 fois plus lente pour les objets vides! garder avec l'option old school (for ... in).
Testé sous Node, Chrome, Firefox et IE 9, il devient évident que pour la plupart des cas d'utilisation:
En termes de performances, utilisez:
ou
Voir les résultats de test détaillés et le code de test sur Is object empty?
la source
Object.keys
est lent, mais moins de code. Sur une petite page, où cela s'appelle ... peut-être 10 fois ... Est-ce que ce sera encore plus lent compte tenu du temps d'analyse supplémentaire du code supplémentaire?Vous pouvez vérifier le nombre de clés d'objet:
la source
Juste une solution de contournement. Votre serveur peut-il générer des propriétés spéciales en cas d'absence de données?
Par exemple:
Ensuite, vous pouvez facilement le vérifier dans votre code de rappel AJAX.
Une autre façon de le vérifier:
EDIT : Si vous utilisez une bibliothèque JSON (par exemple JSON.js), vous pouvez essayer la fonction JSON.encode () et tester le résultat par rapport à une chaîne de valeur vide.
la source
toSource()
n'est pas standard et ne fonctionne pas dans IE ou Opera (et potentiellement d'autres navigateurs que je n'ai pas vérifiés)toSource
propriété dans la section 15.2.4; selon MDC, il a été introduit dans JS1.3 (c'est-à-dire Netscape Navigator 4.06), mais ce n'est PAS dans ECMA-262, 3e édition!toSource()
c'est une façon horrible de le faire (comme c'estJSON.encode()
). Il doit construire une chaîne représentant votre objet entier pour vérifier simplement s'il est vide. Il y a le surcoût de la conversion de choses en chaînes, mais en plus, il faudra convertir un million de choses si votre objet a un million de propriétés, alors qu'en fait, en regarder une seule vous fera savoir qu'il n'est pas vide.J'ai créé une fonction complète pour déterminer si l'objet est vide.
Il utilise
Object.keys
de ECMAScript 5 (ES5) fonctionnalité si possible pour obtenir les meilleures performances (voir tableau de compatibilité ) et à la plus solutions de repli approche compatible pour les moteurs plus anciens (navigateurs).Solution
Voici l' essentiel de ce code.
Et voici le JSFiddle avec démonstration et un test simple.
J'espère que cela aidera quelqu'un. À votre santé!
la source
null
objet.Object.keys(new Date()).length === 0
; donc cette réponse peut être trompeuse.J'utilise ça.
Par exemple:
d'ici
Mise à jour
OU
vous pouvez utiliser l'implémentation jQuery de isEmptyObject
la source
L'exemple suivant montre comment tester si un objet JavaScript est vide, si par vide nous voulons dire qu'il n'a pas de propriétés propres.
Le script fonctionne sur ES6.
la source
la source
Object.keys
ouObject.values
?la source
Object
avec une méthode à travers la chaîne de prototype, car c'est énumérable et l'for in
instruction boucle à travers les propriétés énumérables.jQuery a une fonction spéciale
isEmptyObject()
pour ce cas:En savoir plus sur http://api.jquery.com/jQuery.isEmptyObject/
la source
J'irais vérifier s'il a au moins une clé. Cela suffirait à me dire que ce n'est pas vide.
la source
false
valeur? le résultat serafalse
incorrect.Sous le capot, toutes les méthodes de vérification vides dans toutes les bibliothèques utilisent des clés d'objet pour vérifier la logique. C'est une façon étrange de le rendre compréhensible, que vous pouvez mettre dans une méthode, décrite ici .
Qui a évolué en ES5 , maintenant, vous pouvez simplement vérifier la longueur des clés de l'objet, en utilisant une
Object.Keys
méthode qui prend votre objet comme paramètre:Ou si vous utilisez Lodash (vous devez l'être) alors.
la source
vous pouvez utiliser ce code simple qui n'utilisait pas jQuery ou d'autres bibliothèques
La classe JSON et ses fonctions ( parse et stringify ) sont très utiles mais ont quelques problèmes avec IE7 que vous pouvez résoudre avec ce code simple http://www.json.org/js.html .
Autre méthode simple (méthode la plus simple):
vous pouvez utiliser cette méthode sans utiliser d' objet jQuery ou JSON .
la source
JSON.stringify
la solution échoue si l'objet contient des propriétés non stringables telles que des fonctions ou "indéfinies", bien que ce soit un cas limite.Le meilleur moyen que j'ai trouvé:
Fonctionne pour:
la source
if (!obj && obj !== 0)
.Ma prise:
Juste, je ne pense pas que tous les navigateurs implémentent
Object.keys()
actuellement.la source
Object.keys(new Date()).length === 0
; donc cette réponse peut être trompeuse.Si jQuery et le navigateur Web ne sont pas disponibles, il existe également une fonction isEmpty dans underscore.js.
En outre, il ne suppose pas que le paramètre d'entrée soit un objet. Pour une liste ou une chaîne ou non définie, cela donnera également la bonne réponse.
la source
Caveat! Méfiez-vous des limitations de JSON.
affiche
la source
La bonne réponse est:
Cela vérifie que:
Object.prototype
.En d'autres termes, l'objet est indiscernable de celui créé avec
{}
.la source
En plus de la réponse de Thevs:
c'est jquery + jquery.json
la source
$.isEmptyObject()
, ne perdez pas de cycles avec des conversions non évidentes.Sugar.JS fournit des objets étendus à cet effet. Le code est propre et simple:
Créez un objet étendu:
Vérifiez sa taille:
la source