Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

199
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!