Comment vérifier si une clé particulière existe dans un objet ou un tableau JavaScript?
Si une clé n'existe pas et que j'essaie d'y accéder, est-ce qu'elle retournera false? Ou lancer une erreur?
javascript
arrays
object
Adam Ernst
la source
la source
property.key = property.key || 'some default value'
Réponses:
La vérification de l'indéfini-ness n'est pas un moyen précis de tester si une clé existe. Et si la clé existe mais que la valeur est réellement
undefined
?Vous devez plutôt utiliser l'
in
opérateur:Si vous souhaitez vérifier si une clé n'existe pas, n'oubliez pas d'utiliser des parenthèses:
Ou, si vous souhaitez tester en particulier les propriétés de l'instance d'objet (et non les propriétés héritées), utilisez
hasOwnProperty
:A titre de comparaison des performances entre les méthodes qui sont
in
,hasOwnProperty
et est la cléundefined
, voir cette référencela source
réponse rapide
L'accès direct à une propriété manquante à l'aide d'un style de tableau (associatif) ou d'un style d'objet renvoie une constante non définie .
La lente et fiable dans l' opérateur et hasOwnProperty méthode
Comme les gens l'ont déjà mentionné ici, vous pourriez avoir un objet avec une propriété associée à une constante "non définie".
Dans ce cas, vous devrez utiliser hasOwnProperty ou in operator pour savoir si la clé est vraiment là. Mais à quel prix?
alors je vous le dis ...
in operator et hasOwnProperty sont des "méthodes" qui utilisent le mécanisme Property Descriptor en Javascript (similaire à la réflexion Java dans le langage Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
D'un autre côté, l'appel d'une méthode ou d'une clé d'objet utilisera le mécanisme Javascript [[Get]]. C'est beaucoup plus rapide!
référence
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Utilisation dans l' opérateurLe résultat fut
Utilisation de hasOwnPropertyLe résultat fut
Accès direct aux éléments (style crochets)Le résultat fut
Accès direct aux éléments (style d'objet)Le résultat fut
EDIT: Quelle est la raison pour attribuer à une propriété la
undefined
valeur?Cette question me laisse perplexe. En Javascript, il existe au moins deux références pour les objets absents afin d'éviter des problèmes comme celui-ci:
null
etundefined
.null
est la valeur primitive qui représente l'absence intentionnelle de toute valeur d'objet, ou en bref, le manque de valeur confirmé . En revanche,undefined
est une valeur inconnue (non définie). S'il existe une propriété qui sera utilisée plus tard avec une valeur appropriée , considérez l'utilisation d'unenull
référence au lieu deundefined
parce qu'au moment initial, il est confirmé que la propriété n'a pas de valeur.Comparer:
Conseiller
Évitez les objets avec des
undefined
valeurs. Vérifiez directement dans la mesure du possible et utiliseznull
pour initialiser les valeurs des propriétés. Sinon, utilisez l'in
opérateur ou lahasOwnProperty()
méthode lente .EDIT: 12/04/2018 - PLUS PERTINENT
Comme les gens l'ont commenté, les versions modernes des moteurs Javascript (à l'exception de Firefox) ont changé l'approche pour les propriétés d'accès. L'implémentation actuelle est plus lente que la précédente pour ce cas particulier, mais la différence entre la clé d'accès et l'objet est négligeable.
la source
delete hash[key]
est beaucoup plus lent quehash[key] = undefined
. Bien sûr, dans ce cas, cela n'a aucun sens pour moi d'avoir besoin de l'in
opérateur, mais cela agit comme un contre-exemple de «nous devons toujours éviter de définir la valeur sur undefined».Il reviendra
undefined
.undefined
est une valeur constante spéciale. Vous pouvez donc dire, par exempleC'est probablement le meilleur moyen de vérifier les clés manquantes. Cependant, comme indiqué dans un commentaire ci-dessous, il est théoriquement possible que vous souhaitiez que la valeur réelle soit
undefined
. Je n'ai jamais eu besoin de faire cela et je ne peux pas penser à une raison pour laquelle je le souhaiterais, mais juste pour être complet, vous pouvez utiliser l'in
opérateurla source
var undefined = 42;
. Lorsque vous testez des accessoires non définis, vous devez toujours les utiliser((typeof variable) === "undefined")
.undefined
n'est pas une propriété accessible en écriture selon la spécification ecma-international.org/ecma-262/5.1/#sec-15.1.1.3La réponse acceptée fait référence à Object . Attention à utiliser l'
in
opérateur sur Array pour rechercher des données au lieu de clés:Pour tester des éléments existants dans un tableau: La meilleure façon de savoir si un élément est dans un tableau JavaScript?
la source
Teste probablement uniquement des valeurs d'attribut d'objet très différentes des clés de tableau
la source
Trois façons de vérifier si une propriété est présente dans un objet javascript:
!!obj.theProperty
Convertira la valeur en bool. renvoie
true
pour tout sauf lafalse
valeurtheProperty
' dans objRenvoie true si la propriété existe, quelle que soit sa valeur (même vide)
obj.hasOwnProperty('theProperty')
Ne vérifie pas la chaîne prototype. (puisque tous les objets ont la
toString
méthode, 1 et 2 retourneront true dessus, tandis que 3 peut retourner false dessus.)Référence:
la source
var a = {a : undefined, b : null}; !!a.a **will return false**
!!obj.theProperty
n'est pas une solution pour vérifier si un objet a une propriété nomméetheProperty
. Il échoue pour toute valeur de propriété falseyundefined
, null, numérique0
ouNaN
, et la chaîne vide""
Si vous utilisez la bibliothèque underscore.js , les opérations objet / tableau deviennent simples.
Dans votre cas, la méthode _.has peut être utilisée. Exemple:
renvoie vrai
Mais,
renvoie faux
la source
Réponse:
Explication:
L'
in
opérateur vérifiera si la clé existe dans l'objet. Si vous avez vérifié si la valeur n'était pas définie:,if (myObj["key"] === 'undefined')
vous pourriez rencontrer des problèmes car une clé pourrait éventuellement exister dans votre objet avec laundefined
valeur.Pour cette raison, il est bien préférable d'utiliser d'abord l'
in
opérateur, puis de comparer la valeur qui se trouve à l'intérieur de la clé une fois que vous savez déjà qu'elle existe.la source
Voici une fonction d'aide que je trouve très utile
Cela
keyExists(key, search)
peut être utilisé pour rechercher facilement une clé dans des objets ou des tableaux!Passez-lui simplement la clé que vous souhaitez rechercher et recherchez obj (l'objet ou le tableau) dans lequel vous souhaitez le trouver.
Il a été assez fiable et fonctionne bien entre les navigateurs.
la source
Array.indexOf
méthode intégrée ? (si vous cherchez une valeur, c'est)vanila js
Si vous souhaitez vérifier si l'objet possède au moins une propriété dans es2015
la source
Solution ES6
en utilisant
Array#some
etObject.keys
. Il renverra true si une clé donnée existe dans l'objet ou false dans le cas contraire.Exemple d'une ligne.
la source
On peut utiliser -
hasOwnProperty.call(obj, key);
La manière underscore.js -
la source
La façon la plus simple de vérifier est
par exemple:
La valeur de retour true indique que la clé existe dans l'objet.
la source
Pour ceux qui ont
lodash
inclus dans leur projet:Il existe une méthode lodash _.get qui essaie d'obtenir des clés "profondes":
Cela vérifiera efficacement si cette clé, quelle que soit sa profondeur , est définie et ne générera pas d'erreur qui pourrait nuire au flux de votre programme si cette clé n'est pas définie.
la source
Bien que cela ne vérifie pas nécessairement si une clé existe, il vérifie la véracité d'une valeur. Qui
undefined
etnull
tomber sous.Boolean(obj.foo)
Cette solution me convient le mieux, car j'utilise du texte dactylographié, et l'utilisation de chaînes de ce type
'foo' in obj
ouobj.hasOwnProperty('foo')
pour vérifier si une clé existe ou non ne me fournit pas d'intellisense.la source
Si vous voulez vérifier n'importe quelle clé à n'importe quelle profondeur sur un objet et tenir compte des valeurs de falsey, considérez cette ligne pour une fonction d'utilité:
Résultats
Voir également ce package NPM: https://www.npmjs.com/package/has-deep-value
la source
la source
Dans le monde des tableaux, nous pouvons considérer les index comme une sorte de clé. Ce qui est surprenant, l'
in
opérateur (qui est un bon choix pour l'objet) fonctionne également avec les tableaux. La valeur renvoyée pour la clé non existante estundefined
la source
yourArray.indexOf (yourArrayKeyName)> -1
vrai
faux
la source
Ces exemples peuvent montrer les différences entre les différentes manières. J'espère que cela vous aidera à choisir celui qui convient à vos besoins:
la source
Nouvelle solution impressionnante avec la déstructuration JavaScript :
Vérifiez les autres utilisations de JavaScript Destructuring
la source