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 jeter une erreur?
Vérifier l’indifférence n’est pas un moyen précis de vérifier si une clé existe. Que se passe-t-il si la clé existe mais que la valeur est réellement undefined
?
var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!
Vous devriez plutôt utiliser l'opérateur in
:
"key" in obj // true, regardless of the actual value
Si vous voulez vérifier si une clé n'existe pas, pensez à utiliser des parenthèses:
!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj // ERROR! Equivalent to "false in obj"
Ou, si vous souhaitez particulièrement tester les propriétés de l'instance d'objet (et non les propriétés héritées), utilisez hasOwnProperty
:
obj.hasOwnProperty("key") // true
Pour une comparaison des performances entre les méthodes in
, hasOwnProperty
et la clé est undefined
, voir ceci benchmark
Il retournera undefined
.
var aa = {hello: "world"};
alert( aa["hello"] ); // popup box with "world"
alert( aa["goodbye"] ); // popup box with "undefined"
undefined
est une valeur constante spéciale. Donc, vous pouvez dire, par exemple.
// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
// do something
}
C'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 vois pas pourquoi je voudrais le faire, mais pour être complet, vous pouvez utiliser l'opérateur in
.
// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
// do something
}
Le réponse acceptée fait référence à Objet . Faites attention en utilisant l'opérateur in
on Array pour rechercher des données au lieu de clés:
("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)
Pour tester des éléments existants dans un tableau: Le meilleur moyen de savoir si un élément est dans un tableau JavaScript?
"key" in obj
Teste probablement uniquement les valeurs d'attribut d'objet qui sont très différentes des clés de tableau
Trois façons de vérifier si une propriété est présente dans un objet javascript:
Référence:
Si vous utilisez underscore.js library, les opérations objet/tableau deviennent simples.
Dans votre cas, la méthode _.has peut être utilisée. Exemple:
yourArray = {age: "10"}
_.has(yourArray, "age")
retourne true
Mais,
_.has(yourArray, "invalidKey")
retourne false
Réponse:
if ("key" in myObj)
{
console.log("key exists!");
}
else
{
console.log("key doesn't exist!");
}
Explication:
L'opérateur in
vérifiera si la clé existe dans l'objet. Si vous avez coché 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 la valeur undefined
.
Pour cette raison, il est bien préférable d'utiliser d'abord l'opérateur in
, puis de comparer la valeur contenue dans la clé une fois que vous savez déjà qu'elle existe.
Ce keyExists(key, search)
peut être utilisé pour rechercher facilement une clé dans des objets ou des tableaux!
Il suffit de lui transmettre la clé que vous souhaitez rechercher et de rechercher obj (l’objet ou le tableau) dans lequel vous souhaitez le trouver.
function keyExists(key, search) {
if (!search || (search.constructor !== Array && search.constructor !== Object)) {
return false;
}
for (var i = 0; i < search.length; i++) {
if (search[i] === key) {
return true;
}
}
return key in search;
}
keyExists('Apple', ['Apple', 'banana', 'orange']); // true
keyExists('fruit', ['Apple', 'banana', 'orange']); // false
Recherche de clés dans des objets
keyExists('age', {'name': 'Bill', 'age': 29 }); // true
keyExists('title', {'name': 'Jason', 'age': 29 }); // false
Cela a été assez fiable et fonctionne bien sur plusieurs navigateurs.
vanilla js
yourObjName.hasOwnProperty(key) : true ? false;
Si vous voulez vérifier si l'objet a au moins une propriété dans es2015
Object.keys(yourObjName).length : true ? false
hasOwnProperty.call(obj, key);
Le underscore.js way -
if(_.has(this.options, 'login')){
//key 'login' exists in this.options
}
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
C'est une vieille question, mais je suppose qu'il n'est jamais trop tard pour donner une réponse.
Imaginez que vous avez un objet "produits" et deux articles. Si vous voulez voir si un identifiant existe déjà dans cet objet, vous pouvez utiliser find ()
products = [
{
"id": 1,
"name": "Name 1"
},
{
"id": 2,
"name": "Name 2"
},
]
item1 =
{
"id": 3,
"name": "Name 3",
}
item2 =
{
"id": 1,
"name": "Name 1",
}
if(products.find(x => x.id === item1.id)){
console.log('id is in products');
}else {
console.log('id is not in products');
}
if(products.find(x => x.id === item2.id)){
console.log('id is in products');
}else {
console.log('id is not in products');
}
bûche:
id is not in products
id is in products
Le moyen le plus simple de vérifier est
"key" in object
par exemple:
var obj = {
a: 1,
b: 2,
}
"a" in obj // true
"c" in obj // false
La valeur renvoyée sous la forme true implique que la clé existe dans l'objet.
lodash
inclus dans leur projet:Obtient la valeur sur le chemin de l'objet. Si la valeur résolue n'est pas définie, la valeur par défaut est renvoyée à sa place.
var object = { 'a': [{ 'b': { 'c': 3 } }] };
console.log(
_.get(object, 'a[0].b.c'), // => 3
_.get(object, ['a', '0', 'b', 'c']), // => 3
_.get(object, 'a.b.c'), // => undefined
_.get(object, 'a.b.c', 'default') // => 'default'
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Ceci vérifiera efficacement si cette clé, bien que deep, soit définie et ne le sera pas jettera une erreur qui pourrait nuire au flux de votre programme si cette clé n'est pas définie.
Ces exemples peuvent démontrer les différences entre différentes manières. J'espère que cela vous aidera à choisir celui qui répond le mieux à vos besoins:
// Lets create object `a` using create function `A`
function A(){};
A.prototype.onProtDef=2;
A.prototype.onProtUndef=undefined;
var a=new A();
a.ownProp = 3;
a.ownPropUndef = undefined;
// Let's try different methods:
a.onProtDef; // 2
a.onProtUndef; // undefined
a.ownProp; // 3
a.ownPropUndef; // undefined
a.whatEver; // undefined
a.valueOf; // ƒ valueOf() { [native code] }
a.hasOwnProperty('onProtDef'); // false
a.hasOwnProperty('onProtUndef'); // false
a.hasOwnProperty('ownProp'); // true
a.hasOwnProperty('ownPropUndef'); // true
a.hasOwnProperty('whatEver'); // false
a.hasOwnProperty('valueOf'); // false
'onProtDef' in a; // true
'onProtUndef' in a; // true
'ownProp' in a; // true
'ownPropUndef' in a; // true
'whatEver' in a; // false
'valueOf' in a; // true (on the prototype chain - Object.valueOf)
Object.keys(a); // ["ownProp", "ownPropUndef"]
Si vous souhaitez rechercher une clé quelconque à n'importe quelle profondeur sur un objet et tenir compte des valeurs de Falsey, considérez cette ligne pour une fonction utilitaire:
var keyExistsOn = (o, k) => k.split(".").reduce((a, c) => a.hasOwnProperty(c) ? a[c] || 1 : false, Object.assign({}, o)) === false ? false : true;
Résultats
var obj = {
test: "",
locals: {
test: "",
test2: false,
test3: NaN,
test4: 0,
test5: undefined,
auth: {
user: "hw"
}
}
}
keyExistsOn(obj, "")
> false
keyExistsOn(obj, "locals.test")
> true
keyExistsOn(obj, "locals.test2")
> true
keyExistsOn(obj, "locals.test3")
> true
keyExistsOn(obj, "locals.test4")
> true
keyExistsOn(obj, "locals.test5")
> true
keyExistsOn(obj, "sdsdf")
false
keyExistsOn(obj, "sdsdf.rtsd")
false
keyExistsOn(obj, "sdsdf.234d")
false
keyExistsOn(obj, "2134.sdsdf.234d")
false
keyExistsOn(obj, "locals")
true
keyExistsOn(obj, "locals.")
false
keyExistsOn(obj, "locals.auth")
true
keyExistsOn(obj, "locals.autht")
false
keyExistsOn(obj, "locals.auth.")
false
keyExistsOn(obj, "locals.auth.user")
true
keyExistsOn(obj, "locals.auth.userr")
false
keyExistsOn(obj, "locals.auth.user.")
false
keyExistsOn(obj, "locals.auth.user")
true
Voir également ce package NPM: https://www.npmjs.com/package/has-deep-value
yourArray.indexOf (yourArrayKeyName)> -1
fruit = ['Apple', 'grapes', 'banana']
fruit.indexOf('Apple') > -1
vrai
fruit = ['Apple', 'grapes', 'banana']
fruit.indexOf('Apple1') > -1
faux
Nouvelle solution géniale avec JavaScript Destructuring:
let obj = {
"key1": "value1",
"key2": "value2",
"key3": "value3",
};
let {key1, key2, key3, key4} = obj;
// key1 = "value1"
// key2 = "value2"
// key3 = "value3"
// key4 = undefined
// Can easily use `if` here on key4
if(!key4) { console.log("key not present"); } // Key not present
Ne vérifiez autre utilisation de JavaScript Destructuring
const object1 = {
a: 'something',
b: 'something',
c: 'something'
};
const key = 's';
// Object.keys(object1) will return array of the object keys ['a', 'b', 'c']
Object.keys(object1).indexOf(key) === -1 ? 'the key is not there' : 'yep the key is exist';