Quiero incluir todas las claves de un objeto presente en una matriz y descartar el resto, por ejemplo, si tengo una matriz ,
const arr = ['apple', 'milk', 'bread', 'coke'];y un objeto ,
const dummy = { apple: { category: 'fruit' }, banana: { category: 'fruit' }, potato: { category: 'vegetable' }, dairy: { milk: { type: 'A2' } }, bakery: { bread: { type: 'brown' } }, beverage: { cold_drink: { coke: { type: 'diet' }, beer: { } } } } Quiero que mi objeto resultante contenga solo las claves de arr , ya sean claves directas o profundamente anidadas. Entonces, para el caso anterior, mi objeto resultante se verá así,
{ apple: { category: 'fruit' }, dairy: { milk: { type: 'A2' } }, bakery: { bread: { type: 'brown' } }, beverage: { cold_drink: { coke: { type: 'diet' }, beer: {} } } }Estoy tratando de resolver esto a través de la recursividad , pero no puedo obtener el resultado correctamente. A continuación se muestra mi código, ¿podría ayudarme con dónde me estoy equivocando?
function fetchResultantObject(object, key, result) { if(typeof object !== 'object') return null; for(let objKey in object) { if(key.indexOf(objKey) > -1) { result[objKey] = object[objKey]; } else { result[objKey] = fetchValueByKey(object[objKey], key, result); } } return result; } console.log(fetchResultantObject(dummy, arr, {}));Puede filtrar las entradas y verificar si los objetos (anidados) contienen una clave deseada.
const hasKey = object => object && typeof object === 'object' && (keys.some(k => k in object) || Object.values(object).some(hasKey)), keys = ['apple', 'milk', 'bread', 'coke'], data = { apple: { category: 'fruit' }, banana: { category: 'fruit' }, potato: { category: 'vegetable' }, dairy: { milk: { type: 'A2' } }, bakery: { bread: { type: 'brown' } }, beverage: { cold_drink: { coke: { type: 'diet' } } } }, result = Object.fromEntries(Object .entries(data) .filter(([k, v]) => hasKey({ [k]: v })) ); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }