Tengo una matriz de datos:
const data = [{ name: 'South America', locations: [{ name: 'Argentina', locations: [{ name: 'Buenos Aires' }, {}] }] }, { name: 'Europe', locations: [{ name: 'Spain', locations: [{}] }] }, { name: 'Asia', locations: [{}] }]Me gustaría eliminar cualquier objeto vacío en cualquier nivel (incluso si es muy profundo). Volviendo como el siguiente ejemplo:
[{ name: 'South America', locations: [{ name: 'Argentina', locations: [{ name: 'Buenos Aires' }] }] }, { name: 'Europe', locations: [{ name: 'Spain', locations: [] }] }, { name: 'Asia', locations: [] }] Las locations clave podrían ser cualquier otra cosa.
Mi solución es solo parcial ya que solo elimina el primer nivel.
INTENTO FALLIDO
const result = data.filter(value => Object.keys(value).length !== 0)Me gustaría que esto fuera lo más dinámico posible, sin tener que especificar qué tan anidado será.
Podría usar crear una función recursiva con reduce y un bucle for...in y hacer que se eliminen tanto los objetos vacíos en una matriz como el valor de un objeto.
const data = [{"name":"South America","locations":[{"name":"Argentina","locations":[{"name":"Buenos Aires","foo":{}},{}]}]},{"name":"Europe","locations":[{"name":"Spain","locations":[{}]}]},{"name":"Asia","locations":[{}]}] function removeEmpty(data) { return data.reduce((r, e) => { if (Object.keys(e).length) { const obj = {} for (let k in e) { if (Array.isArray(e[k])) { obj[k] = removeEmpty(e[k]) } else if (typeof e[k] === 'object') { if (Object.keys(e[k]).length) { obj[k] = removeEmpty(e[k]) } } else { obj[k] = e[k] } } r.push(obj) } return r; }, []) } console.log(removeEmpty(data)) const data = [{ name: 'South America', locations: [{ name: 'Argentina', locations: [{ name: 'Buenos Aires' }, {}] }] }, { name: 'Europe', locations: [{ name: 'Spain', locations: [{}] }] }, { name: 'Asia', locations: [{}] }] const isArray = Array.isArray const isObject = (any) => typeof any === 'object' && any !== null function clear(obj) { (function recursive(any, remove) { if (isArray(any)) { for (let i = 0; i < any.length; ++i) { recursive(any[i], () => { any.splice(i--, 1) }) } } else if (isObject(any)) { const values = Object.values(any) if (values.length) { for (let item of values) { recursive(item, () => null) } } else { remove() // <- delete {} } } })(obj, () => null) } // clear(data) console.log(data)