Vous devez le faire étape par étape si vous ne voulez pas de TypeError
car si l'un des membres est null
ou undefined
, et que vous essayez d'accéder à un membre, une exception sera levée.
Vous pouvez soit simplement catch
l'exception, soit créer une fonction pour tester l'existence de plusieurs niveaux, quelque chose comme ceci:
function checkNested(obj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments, 1);
for (var i = 0; i < args.length; i++) {
if (!obj || !obj.hasOwnProperty(args[i])) {
return false;
}
obj = obj[args[i]];
}
return true;
}
var test = {level1:{level2:{level3:'level3'}} };
checkNested(test, 'level1', 'level2', 'level3'); // true
checkNested(test, 'level1', 'level2', 'foo'); // false
MISE À JOUR ES6:
Voici une version plus courte de la fonction d'origine, utilisant les fonctionnalités ES6 et la récursivité (elle est également sous la forme d'un appel d'appel approprié ):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
Cependant, si vous souhaitez obtenir la valeur d'une propriété imbriquée et non seulement vérifier son existence, voici une fonction simple sur une ligne:
function getNested(obj, ...args) {
return args.reduce((obj, level) => obj && obj[level], obj)
}
const test = { level1:{ level2:{ level3:'level3'} } };
console.log(getNested(test, 'level1', 'level2', 'level3')); // 'level3'
console.log(getNested(test, 'level1', 'level2', 'level3', 'length')); // 6
console.log(getNested(test, 'level1', 'level2', 'foo')); // undefined
console.log(getNested(test, 'a', 'b')); // undefined
La fonction ci-dessus vous permet d'obtenir la valeur des propriétés imbriquées, sinon elle reviendra undefined
.
MISE À JOUR 2019-10-17:
La proposition de chaînage facultative a atteint l'étape 3 du processus du comité ECMAScript , cela vous permettra d'accéder en toute sécurité aux propriétés profondément imbriquées, en utilisant le jeton ?.
, le nouvel opérateur de chaînage facultatif :
const value = obj?.level1?.level2?.level3
Si l'un des niveaux accessibles est null
ou undefined
l'expression se résoudra d' undefined
elle-même.
La proposition vous permet également de gérer les appels de méthode en toute sécurité:
obj?.level1?.method();
L'expression ci - dessus produira undefined
si obj
, obj.level1
ou obj.level1.method
sont null
ou undefined
, sinon , il appellera la fonction.
Vous pouvez commencer à jouer avec cette fonctionnalité avec Babel en utilisant le plugin de chaînage en option .
Depuis Babel 7.8.0 , ES2020 est pris en charge par défaut
Consultez cet exemple sur le Babel REPL.
🎉🎉MISE À JOUR: décembre 2019 🎉🎉
La proposition de chaînage facultatif a finalement atteint l'étape 4 lors de la réunion de décembre 2019 du comité TC39. Cela signifie que cette fonctionnalité fera partie de la norme ECMAScript 2020 .