Estoy extrayendo datos de back-end de mi aplicación, pero quiero que el usuario pueda seleccionar qué teclas quiere ver. Así que he estado tratando de construir una forma para que generen una matriz de cadenas y hacer que se compare con cada objeto en la matriz y generar la nueva matriz de objetos con cada tecla excluida.
Aquí está la matriz de filtros:
const filterData = [ 'TestOne', 'TestTwo', ]Aquí está la matriz de objetos:
const data = [ { _id: "62ec2f1084c7f48175a9cb4a", Date: "2022-08-04T15:41:37.567Z", facilityId: "62e5a9fd45f2646fc7361fa3", userId: "62e16d390f4685e4fdb6a288", formData: { Date: "2022-08-04T15:41:37.567Z", TestOne: 60002, TestTwo: 19998, TestThree: 102, TestFour: "True" }, }, { _id: "62ec2f1c84c7f48175a9cb58", Date: "2022-08-04T15:41:52.932Z", facilityId: "62e5a9fd45f2646fc7361fa3", userId: "62e16d390f4685e4fdb6a288", formData: { Date: "2022-08-04T15:41:52.932Z", TestOne: 60003, TestTwo: 19997, TestThree: 103, TestFour: "True" }, }, ] Quiero crear una función que tome data.formData y filtre cualquier clave que no esté incluida en filterData . Estoy teniendo dificultades para averiguar qué es exactamente lo que se necesita hacer para lograr esto. Si alguien pudiera ayudar a la identificación, se lo agradecería mucho.
---- EDITAR ---- Aquí hay algo de un proceso en el que he pensado pero devuelve errores y realmente no puedo pensar por qué.
const formObject = datas.length > 0 && datas.map((data, i) => { const filterData = ['TestOne', 'TestTwo'] filterData.map((filter) => { delete data.formData[filter] }) }) Esta función me da errores de Uncaught TypeError: Cannot delete property 'TestThree' of #<Object> , he intentado crear una nueva instancia de datos pero no funciona
Yo lo haría de esta manera:
const result = data.map(x => { for (const [key, value] of Object.entries(x.formData)) { if (!filterData.includes(key)) { delete x.formData[key]; } } return x; })Espero que esto ayude
Los aspectos más destacados de esta función son:
Antes del primer ciclo, la matriz se clona ✥ y luego se examina cada objeto para encontrar "formData" . Dado que se conocen las claves reales, asumo lógicamente que el objeto que las tiene también se conoce, de ahí la segunda path de parámetro.
Object.keys(obj['formData']) = ["Date", "TestOne", "TestTwo", "TestThree", "TestFour"] :
figura yo
function filterData(array, path, ...keys) { let clone = structuredClone(array); for (let obj of clone) { Object.keys(obj[path]).flatMap(key => //... obj[path] = [ {{["formData"]}}... //... ["Date", "TestOne", "TestTwo", "TestThree", "TestFour"] En el segundo ciclo, las claves del primer ciclo se comparan con el tercer parámetro ...keys , un parámetro de descanso que consta de una o más claves para filtrar. La condición if se ha invertido con ! operador:
Figura II
if (![...keys].includes(key)) { return []; } return delete obj[path][key]; ✥ El TypeError suena como si el objeto estuviera congelado, por lo que al clonar la matriz puede trabajar libremente en el clon.
const data = [{ _id: "62ec2f1084c7f48175a9cb4a", Date: "2022-08-04T15:41:37.567Z", facilityId: "62e5a9fd45f2646fc7361fa3", userId: "62e16d390f4685e4fdb6a288", formData: { Date: "2022-08-04T15:41:37.567Z", TestOne: 60002, TestTwo: 19998, TestThree: 102, TestFour: "True" } }, { _id: "62ec2f1c84c7f48175a9cb58", Date: "2022-08-04T15:41:52.932Z", facilityId: "62e5a9fd45f2646fc7361fa3", userId: "62e16d390f4685e4fdb6a288", formData: { Date: "2022-08-04T15:41:52.932Z", TestOne: 60003, TestTwo: 19997, TestThree: 103, TestFour: "True" } }]; /** * Find any given number of keys and remove them * @param {array<object>} array - An array of objects * @param {string} path - Name of the key if the target object is one * level down. (todo: recursive algorithm to dig deeper) * @param {string/array<string>} keys - List of keys to filter out * @return {array<object>} The array sans filtered keys */ function filterData(array, path, ...keys) { let clone = structuredClone(array); for (let obj of clone) { Object.keys(obj[path]).flatMap(key => { if (![...keys].includes(key)) { return []; } return delete obj[path][key]; }); } return clone; } let x = filterData(data, "formData", "Date", "TestFour"); console.log(x);