Tengo una matriz de objetos, ejemplo:
[ { "fName": "Jon", "lName": "Doe", "age": "30", "shirtSize": "M" }, { "fName": "Jane", "lName": "Foe", "age": "25", "shirtSize": "M" }, ... ]
También tengo una lista de claves, ejemplo:
["age", "shirtSize"]
Quiero tomar la matriz de objetos y crear una nueva matriz de objetos que coincida con la matriz de la lista de claves, filtrando efectivamente la matriz de objetos para tener solo los pares clave/valor que quiero. Los anteriores son ejemplos, y los conjuntos de datos reales son, por supuesto, más detallados. Lo he forzado bruscamente en mi algoritmo a continuación y, como era de esperar, no es muy eficaz en absoluto, como resultado de mi bucle dentro del mapa. Mi resultado es como:
[ { "age": "30", "shirtSize": "M" }, { "age": "25", "shirtSize": "M" }, ... ]
No estoy usando nada como lodash. ¿Cómo puedo mejorar este rendimiento?
const data = [ { "fName": "Jon", "lName": "Doe", "age": "30", "shirtSize": "M" }, { "fName": "Jane", "lName": "Foe", "age": "25", "shirtSize": "M" } ]; const keyList = ["age", "shirtSize"]; const filteredDataset = data.map((elem) => { let tempHolder = {}; for (let key of keyList) { tempHolder[key] = elem[key]; } return tempHolder; }); return filteredDataset;
var results = []; for(var person of data){ var obj = {}; for(var key of keyList){ obj[key] = person[key]; } results.push(obj); }
El primer ciclo itera a través de los datos, y el ciclo interno itera a través de keyList y agrega esos atributos al objeto temporal, que luego se envía a la matriz de resultados.
EDITAR: Su código es básicamente el mismo, con el suyo solo usando el mapa para iterar en lugar de un bucle for...of.
Puede expresar el mismo algoritmo de forma más declarativa:
const select = (props) => (objs) => objs .map (o => Object .fromEntries (props .map (p => [p, o[p]]))) const items = [{fName: "Jon", lName: "Doe", age: "30", shirtSize: "M"}, {fName: "Jane", lName: "Foe", age: "25", shirtSize: "M"}] console .log (select (["age", "shirtSize"]) (items))