Estoy trabajando con dos objetos en JS y necesito saber si existe un subobjeto determinado. Mis objetos se parecen a esto:

obj1 = {
   sobj1: 1234,
   sobj2: {
      ssobj1: "abc",
      ssobj2: 1234
   }
}

El problema es que no sé de antemano la forma exacta del objeto y cuando trato de verificar si ssojb1 existe con if (obj1.sobj2.ssobj1) y sobj2 no está configurado, voy a aparece un error como "intentando leer la propiedad ssobj1 de undefined.

Para evitar esto, mi enfoque era utilizar una cascada de declaraciones if, pero estoy bastante seguro de que hay una mejor opción. Esto puede ponerse feo bastante rápido.

¿Alguna sugerencia?

0
Murilo Schünke 24 jun. 2020 a las 21:56

2 respuestas

Hay un operador encadenamiento opcional admitido en navegadores modernos ?., pero aún puede estar trabajando con las declaraciones if en ese momento. En estos casos, las utilidades pueden ayudarlo.

const isDefined = x => typeof x !== 'undefined'

const { get } = rubico

const pathsToCheck = [
  'sobj2.ssobj1',
  'sobj2.ssobj3',
]

const checkPath = (path, obj) => isDefined(get(path)(obj))

const obj1 = {
   sobj1: 1234,
   sobj2: {
      ssobj1: "abc",
      ssobj2: 1234
   }
}

for (const path of pathsToCheck) {
  console.log(path, checkPath(path, obj1))
}
<script src="https://unpkg.com/rubico"></script>

Descargo de responsabilidad: Soy la autora de rubico.

Documentación para obtener

0
richytong 24 jun. 2020 a las 19:10

Gracias a mousetail por la solución.

Aparentemente, usar if ('key' in obj) hace el truco, incluso si obj no está definido.

Así que:

if ('ssobj1' in obj1) {   // true or false
   do stuff...
}
0
Murilo Schünke 24 jun. 2020 a las 20:50