Estoy tratando de buscar cualquier par clave: valor en un objeto en JavaScript y devolver el subobjeto al que pertenece.
Lo que he hecho hasta ahora no devuelve mi objeto como se esperaba y no puedo encontrar por qué.
function searchSheet(obj, keyName, valName) { let found for (prop in obj) { if (typeof obj[prop] == "object") { searchSheet(obj[prop], keyName, valName); } else { if (prop === keyName && obj[prop] === valName) { found = obj console.log(found); // found is logged correctly here return found // …but nothing is returned here } } } } let sheet = { "config": {}, "patterns": { "id": 0, "type": "pattern", "startTime": 1652193369859, "synth": "tic", "keys": [{ "id": 1, "type": "key", "keyCode": 73, "startTime": 1652193369960, "note": 730, "offset": "12.1" }, { "id": 2, "type": "key", "keyCode": 82, "startTime": 1652193370371, "note": 820, "offset": "61.2" } ], "endTime": 1652193370695, "duration": 836, "loop": 35 } } console.log( searchSheet(sheet, "keyCode", 82) // undefined )El comentario de Ian Brindley es parcialmente correcto. Está descartando el valor de retorno de la llamada recursiva. Puedes arreglar tu código cambiando esto
if (typeof obj[prop] == "object") { searchSheet(obj[prop], keyName, valName); } else { //...a esto
if (typeof obj[prop] == "object") { let objectFound = searchSheet(obj[prop], keyName, valName); if (objectFound !== undefined) return objectFound } else { //...Hay otros enfoques, en particular los que utilizan una función auxiliar anidada.