tengo una pregunta muy simple asumir el objeto de abajo
const x={a:{b:"b"},c:{b:"b"}} 1) Quiero un método para devolver todas las claves en mi objeto anidado, por ejemplo, ["a", "b", "c"] 2) Quiero un método para devolver todas las rutas de mi clave específica, por ejemplo, para b => [" a","c"] usando lodash, tenemos el método _.get(obj,path) que devuelve el valor del objeto por la ruta que pasamos para obtener el método, pero ¿qué pasa con las veces que no tenemos la ruta o la ruta es vaga debajo del código para resolver el problema de alguna manera?
const findPath = (ob, key) => { const path = []; const keyExists = (obj) => { if (!obj || (typeof obj !== "object" && !Array.isArray(obj))) { return false; } else if (obj.hasOwnProperty(key)) { return true; } else if (Array.isArray(obj)) { let parentKey = path.length ? path.pop() : ""; for (let i = 0; i < obj.length; i++) { path.push(`${parentKey}[${i}]`); const result = keyExists(obj[i], key); if (result) { return result; } path.pop(); } } else { for (const k in obj) { path.push(k); const result = keyExists(obj[k], key); if (result) { return result; } path.pop(); } } return false; }; keyExists(ob); return path.join("."); }los problemas con el código anterior son: 1) no está limpio 2) no devuelve todas las rutas, por ejemplo en x={a:{b:"b"},c:{b:"b"}} devuelve solo "a"
Puede adoptar un enfoque recursivo y verificar si la clave existe, luego devolver esta clave, envuelta en una matriz anidada o devolver el resultado de los objetos anidados y mapear esto con la clave real o devolver una matriz vacía, que no es entrada para un plano mapa.
const findPathes = (object, key) => key in object ? [[key]] : Object.entries(object).flatMap(([k, v]) => { if (!v || typeof v !== 'object') return []; const pathes = findPathes(v, key); return pathes.length ? pathes.map(a => [k, ...a]) : []; }), data = { a: { b: "b" }, c: { b: "b" }, d: { e: { f: { g: "g" }, h: { b: 'b' } } } } ; console.log(findPathes(data, 'b')); .as-console-wrapper { max-height: 100% !important; top: 0; }