Tengo una matriz como esta:
const data = [ { percent: 123, unit: -1 }, { percent: 456, unit: 0 }, { percent: 0, unit: 5}, { percent: 789, unit: -3 } ];y estoy tratando de eliminar todas las propiedades que tienen valor 0, por lo que el resultado deseado será así:
var data = [ { percent: 123, unit: -1 }, { percent: 456 }, { unit: 5}, { percent: 789, unit: -3 } ];He intentado algo como esto:
const newData = data.map(e => Object.keys(e).forEach(key => e[key] === 0 && delete e[key]));pero eso devuelve una matriz de valores indefinidos.
const data = [ { percent: 123, unit: -1 }, { percent: 456, unit: 0 }, { percent: 0, unit: 5}, { percent: 789, unit: -3 } ]; const newData = data.map(e => Object.keys(e).forEach(key => e[key] === 0 && delete e[key])) console.log(newData)¿Qué estoy haciendo mal? ¡Gracias por adelantado!
Array#forEach no devuelve una matriz.
Para lograr el resultado deseado, en cada iteración, use Object#entries para obtener los pares clave-valor del objeto actual y Array#filter para filtrar aquellos donde el value es cero. Para construir el objeto resultante nuevamente, use Object#fromEntries :
const data = [ { percent: 123, unit: -1 }, { percent: 456, unit: 0 }, { percent: 0, unit: 5}, { percent: 789, unit: -3 } ]; const newData = data.map(e => Object.fromEntries( Object.entries(e).filter(([key, value]) => value !== 0) ) ); console.log(newData)Todo está indefinido porque no está devolviendo nada del método dentro de data.map .
Puede usar el método Array reduce para resolver este problema.
const data = [ { percent: 123, unit: -1 }, { percent: 456, unit: 0 }, { percent: 0, unit: 5}, { percent: 789, unit: -3 } ]; const newData = data.map(e => { const newObj = Object.keys(e).reduce((prev, curr) => { if(e[curr] !== 0) prev[curr] = e[curr]; return prev; }, {}); return newObj; }) console.log(newData)