Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

198
Vistas
Valor devuelto correspondiente a una clave buscada en un objeto Javascript profundamente anidado

Tengo un objeto como el siguiente en Javascript,

 const obj = { "group1": { "sub_group1_1": { "inner_sub_group1_1_1": { "name": "abc" }, "inner_sub_group1_1_2": { "name": "def" } }, "sub_group1_2": { "inner_sub_group1_2_1": { "name": "ghi" }, "inner_sub_group1_2_2": { "name": "jkl" } } }, "group2": { "sub_group2_1": { "inner_sub_group2_1_1": { "name": "mno" }, "inner_sub_group2_1_2": { "name": "pqr" } }, "sub_group2_2": { "inner_sub_group2_2_1": { "name": "stu" }, "inner_sub_group2_2_2": { "name": "wxy" } } } }

Quiero escribir una función que pueda buscar una clave en el objeto anterior y devolverme el valor correspondiente de esa clave, por ejemplo,

Aporte

 filterObject(obj, 'inner_sub_group2_2_2')

Producción

 { "name": "wxy }

Aporte

 filterObject(obj, 'inner_sub_group1_1_1')

Producción

 { "name": "abc }

Acercarse

He escrito una función recursiva para lo mismo, pero no parece funcionar para el segundo escenario,

 const filterObject = (obj, searchedKey) => { let result = {}; for (const key in obj) { const currentObj = obj[key]; if (key === searchedKey) { result = currentObj; break; } else if (typeof currentObj === 'object') { result = filterObject(currentObj, searchedKey); } } return result; };

Cualquier tipo de ayuda sería muy apreciada. ¡Gracias!

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

El problema en su código es que si la llamada recursiva tiene éxito, el ciclo aún continúa, con otra llamada recursiva que puede no tener éxito y, por lo tanto, se pierde el buen result .

Necesita un if después de esa llamada recursiva que detecta el éxito y se rompe si es uno.

Ahora, para hacer la distinción entre el fracaso y el éxito, hará las cosas mucho más fáciles si devuelve null cuando no hay éxito.

Hay que ajustar dos líneas:

 const filterObject = (obj, searchedKey) => { let result = null; // To indicate nothing found yet for (const key in obj) { const currentObj = obj[key]; if (key === searchedKey) { result = currentObj; break; } else if (typeof currentObj === 'object') { result = filterObject(currentObj, searchedKey); if (result) break; // <--- break out when success! } } return result; };

Es posible que se necesite una pequeña mejora en su prueba es-objeto, porque typeof null === 'object' es una expresión verdadera.

Puedes usar esto en su lugar:

 if (Object(currentObj) === currentObj)
about 4 years ago · Juan Pablo Isaza Denunciar

0

Debe poder verificar si la llamada recursiva encontró algo, lo cual no está haciendo; en este momento, solo está reasignando result y luego ignorándolo y pasando a la siguiente iteración del bucle.

Un enfoque que funcionaría para esta situación en particular sería verificar si el objeto resultante tiene alguna clave.

 const obj={group1:{sub_group1_1:{inner_sub_group1_1_1:{name:"abc"},inner_sub_group1_1_2:{name:"def"}},sub_group1_2:{inner_sub_group1_2_1:{name:"ghi"},inner_sub_group1_2_2:{name:"jkl"}}},group2:{sub_group2_1:{inner_sub_group2_1_1:{name:"mno"},inner_sub_group2_1_2:{name:"pqr"}},sub_group2_2:{inner_sub_group2_2_1:{name:"stu"},inner_sub_group2_2_2:{name:"wxy"}}}}; const filterObject = (obj, searchedKey) => { if (searchedKey in obj) { return obj[searchedKey]; } for (const key in obj) { const currentObj = obj[key]; if (typeof currentObj === 'object') { const result = filterObject(currentObj, searchedKey); if (Object.keys(result).length) return result; } } return {}; }; console.log(filterObject(obj, 'inner_sub_group2_2_2')); console.log(filterObject(obj, 'inner_sub_group1_1_1'));

Pero eso no funcionará si el valor encontrado no es un objeto, o si el objeto encontrado está vacío. (Se devolvería una referencia de objeto diferente no conectada con la estructura original).

Para la situación más general, la llamada recursiva debe devolver dos cosas: si se encontró o no el valor anidado y el valor encontrado (si lo hay). Un enfoque para esto es devolver un objeto si se encontró algo, y nada en caso contrario.

 const obj={group1:{sub_group1_1:{inner_sub_group1_1_1:{name:"abc"},inner_sub_group1_1_2:{name:"def"}},sub_group1_2:{inner_sub_group1_2_1:{name:"ghi"},inner_sub_group1_2_2:{name:"jkl"}}},group2:{sub_group2_1:{inner_sub_group2_1_1:{name:"mno"},inner_sub_group2_1_2:{name:"pqr"}},sub_group2_2:{inner_sub_group2_2_1:{name:"stu"},inner_sub_group2_2_2:{name:"wxy"}}}}; const filterObject = (obj, searchedKey) => { if (searchedKey in obj) { return { result: obj[searchedKey] }; } for (const key in obj) { const currentObj = obj[key]; if (typeof currentObj === 'object') { const result = filterObject(currentObj, searchedKey); if (result) return result; } } }; console.log(filterObject(obj, 'inner_sub_group2_2_2').result); console.log(filterObject(obj, 'inner_sub_group1_1_1').result);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Aquí hay una variación de las respuestas de @trincot y @certainperformance. Nada fundamentalmente nuevo, solo un estilo ligeramente diferente:

 const obj={group1:{sub_group1_1:{inner_sub_group1_1_1:{name:"abc"},inner_sub_group1_1_2:{name:"def"}},sub_group1_2:{inner_sub_group1_2_1:{name:"ghi"},inner_sub_group1_2_2:{name:"jkl",spoiler:null}}},group2:{sub_group2_1:{inner_sub_group2_1_1:{name:"mno"},inner_sub_group2_1_2:{name:"pqr",xtr:false}},sub_group2_2:{inner_sub_group2_2_1:{name:"stu"},inner_sub_group2_2_2:{name:"wxy"}}}}; function deepGet(obj,k,r){ // call with two arguments only if(obj&&typeof obj=="object") { if(k in obj) return obj[k]; for(l in obj) if((r=deepGet(obj[l],k))!=null) return r; } return null; } console.log(['inner_sub_group2_2_2','inner_sub_group1_1_1','xtr'].map(k=>deepGet(obj,k)));

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda