Pourquoi après avoir remplacé if (typeof obj [key] == 'object') par if (typeof obj.key == 'object') le résultat est ne vous attendez pas.
voici mon code:
var animals = {
bird: {
color: 'blue',
action: {
fly: true,
nesting: true,
swim:false
},
eat:'insect'
}
};
function GetObjectKeys(obj, keys) {
for (let key in obj) {
//if (typeof obj.key == 'object')
if (typeof obj[key] == 'object')
{
keys.push(key);
GetObjectKeys(obj[key], keys);
}
else {
keys.push(key);
}
}
return keys;
}
arrKeys = [];
GetObjectKeys(animals, arrKeys);
//
- result expect:
[
'bird', 'color',
'action', 'fly',
'nesting', 'swim',
'eat'
]
- result when use if (typeof obj.key == 'object') :
[ 'bird' ]
Merci!
4 Réponses :
La clé de votre exemple de notation par points ( obj.key ) est une chaîne, votre obj ne possède pas la propriété nommée < strong> key , il n'est donc pas défini.
Vous passez une variable dans votre notation entre crochets, for (let key in obj) boucle tous les noms de propriété dans votre objet obj . Donc, obj [clé] équivaut essentiellement à obj ['oiseau'] de votre premier appel de fonction.
La façon dont je le vois, lorsque vous utilisez for ... dans l'expression , key est la clé avec le type de chaîne. comme "key1","key2","key3'
donc, lorsque vous utilisez la clé comme obj.key , c'est comme obj. "clé . Il se produit donc une erreur. p>
afin que vous puissiez utiliser des clés de propriété dynamiques telles que obj [key] .
utiliser obj [key] est préférable pour ce type d'utilisation. Regardez ici:
var obj = {key: 1, key2: 2}
var key = 'key2';
obj.key = 3;
obj[key] = 4; // result: {key: 3, key2: 4}
obj.key equal obj ["key"] recherchera "key" comme propriété dans votre objet, et évidemment là n'est pas une propriété key dans animaux object ==> obj.key égal à obj ["key"] est < code> indéfini . ==> vous avez obtenu un résultat inattendu. obj [key] prend dynamiquement la valeur de key pour passer la notation. Par exemple, const key = "name" => obj [key] égal à obj.name . C'est "oiseau" dans votre cas obj [clé] égal à obj ["oiseau"] égal à obj.bird code >
Bienvenue dans StackOverflow! Vous devrez coller ici les résultats que vous voyez, puis les résultats que vous attendez de voir. Cela nous aidera à déterminer ce que vous essayez de faire.
Lorsque vous utilisez
obj.keys, il recherche une propriété nommée littéralement "key" À L'INTÉRIEUR de l'objet. MAIS il n'y en a pas avec ce nom! Plus d'infos: Est-il possible d'ajouter dynamiquement nommé propriétés à l'objet JavaScript?