Digamos que tengo un objeto de entrada como este:
const obj = { deep: { someKey: 'someValue1!', veryDeep: { someOtherKey: 'someOtherValue' } }, deep2: { aa: 'bba' } } Quiero escribir una función que tome este objeto como primer argumento y la cadena clave como segundo argumento. Luego recorrerá obj con recursividad y encontrará el valor y lo devolverá. Entonces, si nombro esta función getObjectValueOfKey , se llamará así: getObjectValueOfKey(obj, 'aa') y devolverá 'bba' .
Creo que estoy cerca con este código:
const getObjectValueOfKey = (obj, key) => { const keys = Object.keys(obj) for (let currKey of keys) { if (typeof obj[currKey] === 'object') { getObjectValueOfKey(obj[currKey], key) } if (currKey === key) { return obj[key] } } } const res = getObjectValueOfKey(obj, 'aa') console.log('res', res) pero por algunas razones desconocidas para mí, res no está undefined .
estuviste bastante cerca, la recursividad fue buena, pero el problema está relacionado con lo que no devuelven todas las rutas en tu código, en realidad, la única ruta que regresa es cuando encontraste la clave en el primer nivel del objeto, después de que hiciste la recursión y encontró el resultado pero no devolvió nada, el código llega al final de la función y javascript regresa por defecto indefinido si no se encuentra ningún retorno, para resolver el problema decide almacenar los resultados encontrados en la recursión en una variable y devolver ese valor al final de la función.
const getObjectValueOfKey = (obj, key, found) => { const keys = Object.keys(obj); let result = undefined; result ||= found; for (let currKey of keys) { if (typeof obj[currKey] === "object") { result ||= getObjectValueOfKey(obj[currKey], key, result); } if (currKey === key) { return obj[key]; } } return result; }; const res = getObjectValueOfKey(obj, "aa", undefined); console.log("res", res);