const clean = (obj) => Object.entries(obj).reduce((acum, [key, value]) => (value == null ? acum : (acum[key] = value, acum)), {});
Object.entries() devuelve una matriz de pares propios de una propiedad enumerable [key, value] de un objeto dado, en el mismo orden que es proporcionado por for...in (La diferencia es que un bucle for-in enumera las propiedades en la cadena de prototipos).
const persona = {nombre: 'Roberto', apellido: 'Fernández', profesión: null, apodo:'', hijos: undefined};
Object.entries(persona) --> [
[ 'nombre', 'Roberto' ],
[ 'apellido', 'Fernández' ],
[ 'profesión', null ],
[ 'apodo', '' ],
[ 'hijos', undefined ]
]
reduce() ejecuta una función reductora sobre cada elemento de un array, devolviendo como resultado un único valor.
const array1 = [1, 2, 3, 4];
const initialValue = 7;
const sumWithInitial = array1.reduce((acumulador, currentValue) => acumulador+ currentValue, initialValue
); ---> // 17 --> 7+1+2+3+4.
Sin initial value --> // 10 --> 1+2+3+4
initialValue(Opcional): Un valor a usar como primer argumento en la primera llamada de la función callback. Si no se proporciona el valorInicial, el primer elemento del array será utilizado y saltado. Llamando a reduce() sobre un array vacío sin un valorInicial lanzará un TypeError.
La primera vez que se llama la función, acumulador y valorActual pueden tener uno de dos valores. Si se proveyó un valorInicial al llamar a reduce, entonces acumulador será igual al valorInicial y valorActual será igual al primer elemento del array. Si no se proveyó un valorInicial, entonces acumulador será igual al primer valor en el array y valorActual será el segundo.
La función clean devuelve un objeto donde no se guarda los elementos nulos, pero se podría añadir a la condición otros atributos con otros valores: value === '' || value === null || value === undefined;
reduce((acum, [key, value]) La función reduce recibe dos argumentos: acum toma el valor del initialValue {} --> que Es un objeto vacío. y el primer elemento del array que hemos creado con Object.entries(persona) --> ['nombre', 'Roberto' ],
(value == null ? acum : (acum[key] = value, acum)) La función reduce evalua el valor de value, y si es null, devuelve el objeto acum y si no lo es, crea la propiedad en acum a través de acum[key] = value y devuelve el objeto acum.
CURIOSIDAD: Esta forma de retornar retornar la información (acum[key] = value, acum)) tiene como propiedad que primero crea la propiedad en acum con acum[key] y por otra parte retorna el objeto acum.