Quiero devolver un objeto que contenga solo las claves que se pasan a través de una matriz, por ejemplo, tengo una matriz de claves,
const arr = ['a', 'b', 'c', 'd', 'e']y un Objeto,
const obj = { a: { name: 'a', capital: 'A' }, g: { name: 'g', capital: 'G' }, b: { name: 'b', capital: 'B' }, m: { c: { name: 'c', capital: 'C' } }, z: { name: 'z', capital: 'Z' }, n: { e: { name: 'e', capital: 'E' } }, o: { f: { d: { name: 'd', capital: 'D' } } } } Ahora quiero devolver un Objeto que contenga solo las claves presentes en arr , 'a', 'b', 'c', 'd' and 'e' , por lo que mi objeto resultante será,
{ a: { name: 'a', capital: 'A' }, b: { name: 'b', capital: 'B' }, c: { name: 'c', capital: 'C' }, e: { name: 'e', capital: 'E' }, d: { name: 'd', capital: 'D' } }Acercarse:
Me acerco como se muestra a continuación, pero no obtengo el resultado deseado,
function fetchValueByKey(object, key, result) { if(typeof object !== 'object') return result; for(let objKey in object) { if(key.indexOf(objKey) > -1) { result[objKey] = object[objKey]; console.log(result); } else { result[objKey] = fetchValueByKey(object[objKey], key, result); console.log(result) } } } console.log(fetchValueByKey(obj, arr, {}));Por favor, sugiérame cómo puedo lograr esto.
Su código es bueno; solo necesita devolver o generar el resultado después del ciclo. ADEMÁS , no hay necesidad de result[objKey] = ya que ya ha determinado que objKey no está en la lista de claves que está buscando, así que simplemente llame a la función nuevamente para profundizar en el subobjeto.
const arr = ['a', 'b', 'c', 'd', 'e'] const obj = { a: { name: 'a', capital: 'A' }, g: { name: 'g', capital: 'G' }, b: { name: 'b', capital: 'B' }, m: { c: { name: 'c', capital: 'C' } }, z: { name: 'z', capital: 'Z' }, n: { e: { name: 'e', capital: 'E' } }, o: { f: { d: { name: 'd', capital: 'D' } } } }; function fetchValueByKey(object, key, result) { if(typeof object !== 'object') return result; for(let objKey in object) { if(key.indexOf(objKey) > -1) { result[objKey] = object[objKey]; //console.log(result); } else { fetchValueByKey(object[objKey], key, result); //console.log(result) } } return result; } console.log(fetchValueByKey(obj, arr, {}));Puede obtener entradas planas y filtradas y construir un objeto.
const getFlatFilteredEntries = object => Object .entries(object) .flatMap(([k, v]) => 'name' in v // or other indicator of leaf object ? keys.includes(k) ? [[k, v]] : [] : getFlatFilteredEntries(v) ), keys = ['a', 'b', 'c', 'd', 'e'], object = { a: { name: 'a', capital: 'A' }, g: { name: 'g', capital: 'G' }, b: { name: 'b', capital: 'B' }, m: { c: { name: 'c', capital: 'C' } }, z: { name: 'z', capital: 'Z' }, n: { e: { name: 'e', capital: 'E' } }, o: { f: { d: { name: 'd', capital: 'D' } } } }, result = Object.fromEntries(getFlatFilteredEntries(object)); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Podemos usar JSON.stringify aquí para iterar sobre cada objeto anidado y podemos verificar si la clave está incluida en la matriz y agregarla en el objeto.
const obj = { a: { name: 'a', capital: 'A' }, g: { name: 'g', capital: 'G' }, b: { name: 'b', capital: 'B' }, m: { c: { name: 'c', capital: 'C' } }, z: { name: 'z', capital: 'Z' }, n: { e: { name: 'e', capital: 'E' } }, o: { f: { d: { name: 'd', capital: 'D' } } } } const arr = ['a', 'b', 'c', 'd', 'e']; function getObjects(arr, obj) { const a = {}; let str = JSON.stringify(obj, (key, value) => { if(arr.includes(key)) { a[key] = value; return value } return value }); return a; } console.log(getObjects(arr, obj));Resuelto un problema similar con JSON.stringify es realmente útil cuando se juega con objetos. ¿Cuál es la forma eficiente de clonar superficialmente un objeto usando JavaScript?