Tienes que hacerlo paso a paso si no quieres un TypeError
porque si uno de los miembros es null
o undefined
, e intentas acceder a un miembro, se lanzará una excepción.
Puede simplemente catch
la excepción, o hacer una función para probar la existencia de múltiples niveles, algo como esto:
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
ACTUALIZACIÓN ES6:
Aquí hay una versión más corta de la función original, que usa las funciones y la recursión de ES6 (también está en forma de cola ):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
Sin embargo, si desea obtener el valor de una propiedad anidada y no solo verificar su existencia, aquí hay una función simple de una línea:
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 función anterior le permite obtener el valor de las propiedades anidadas, de lo contrario volverá undefined
.
ACTUALIZACIÓN 2019-10-17:
La propuesta de encadenamiento opcional alcanzó la Etapa 3 en el proceso del comité ECMAScript , esto le permitirá acceder de manera segura a propiedades profundamente anidadas, utilizando el token ?.
, el nuevo operador de encadenamiento opcional :
const value = obj?.level1?.level2?.level3
Si alguno de los niveles accedidos es null
o undefined
la expresión se resolverá undefined
por sí misma.
La propuesta también le permite manejar llamadas a métodos de manera segura:
obj?.level1?.method();
La expresión anterior producirá undefined
if obj
, obj.level1
or obj.level1.method
are null
o undefined
, de lo contrario, llamará a la función.
Puedes comenzar a jugar con esta función con Babel usando el complemento de encadenamiento opcional .
Desde Babel 7.8.0 , ES2020 es compatible por defecto
Verifique este ejemplo en el REPL de Babel.
🎉🎉 ACTUALIZACIÓN: diciembre de 2019 🎉🎉
La propuesta de encadenamiento opcional finalmente alcanzó la Etapa 4 en la reunión de diciembre de 2019 del comité TC39. Esto significa que esta característica será parte del Estándar ECMAScript 2020 .