Supongamos que tengo un objeto:
let array = [ {a: 1, b: 5, c: 9}, {a: 2, b: 6, c: 10}, {a: 3, b: 7, c: 11}, {a: 4, b: 8, c: 12} ];entonces tengo un diccionario:
const columns = [ { key: 'a', value: 'a' }, { key: 'b', value: 'b' }, ]Quiero filtrar las propiedades que no están definidas en las columnas.
Yo he tratado
array.map((x) => ({"a": xa, "b": xb}))¿Hay alguna forma de usar los datos definidos en las columnas en lugar de escribir manualmente todas las propiedades?
Salida deseada:
[ { "a": 1, "b": 5 }, { "a": 2, "b": 6 }, { "a": 3, "b": 7 }, { "a": 4, "b": 8 } ]Puede asignar entradas y obtener los nuevos objetos.
let array = [{ a: 1, b: 5, c: 9 }, { a: 2, b: 6, c: 10 }, { a: 3, b: 7, c: 11 }, { a: 4, b: 8, c: 12 }], columns = [{ key: 'a', value: 'a' }, { key: 'b', value: 'b' }], keys = columns.map(({ key }) => key), result = array.map(o => Object.fromEntries(keys.map(k => [k, o[k]]))); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Podrías usar esto.
Esto usa solo una matriz para contener las columnas deseadas porque no entiendo por qué usaría un diccionario con la clave y el valor iguales.
let array = [ { a: 1, b: 5, c: 9 }, { a: 2, b: 6, c: 10 }, { a: 3, b: 7, c: 11 }, { a: 4, b: 8, c: 12 }, ]; const desiredColumns = ["a", "b"]; const transformed = array.map(item => { const obj = {}; desiredColumns.forEach(col => { if(col in item){ obj[col] = item[col]; } }) return obj; }) console.log(array); console.log(transformed)Otra forma un poco menos directa de usar map() y reduce() :
array para obtener el resultado deseadokeep la matriz const array = [{a: 1, b: 5, c: 9}, {a: 2, b: 6, c: 10}, {a: 3, b: 7, c: 11}, {a: 4, b: 8, c: 12} ]; const columns = [{ key: 'a', value: 'a' }, { key: 'b', value: 'b' }, ]; const toKeep = columns.map(({ key }) => key).flat(); const result = array.map(a => Object.keys(a) .reduce((prev, cur) => (toKeep.includes(cur)) ? { ...prev, [cur]: a[cur] } : prev, {}) ); console.log(result);Resultado:
[ { "a": 1, "b": 5 }, { "a": 2, "b": 6 }, { "a": 3, "b": 7 }, { "a": 4, "b": 8 } ]