Similar a Ramda: ¿Cómo eliminar claves en objetos con valores vacíos? pero estoy buscando algo que funcione recursivamente. Esto es para que pueda solucionar una "característica" de AJV y JSON Schema donde null !== undefined
.
Empecé con esto... que es eliminar los valores nulos pero no funciona recursivamente
import R from 'ramda'; describe('filter null values', () => { it('should filter out null values', () => { const specimen = { tasks: [ { id: 'foo', blank: '', zero: 0, nool: null }, { nool: null }, { id: '', blank: null, zero: 0, nool: null }, ], useless: { nool: null }, uselessArray: [{ nool: null }], nool: null, }; const expectation = { tasks: [ { id: 'foo', blank: '', zero: 0 }, { id: '', zero: 0 }, ], }; const removeNulls = R.reject(R.equals(null)); expect(removeNulls(specimen)).toEqual(expectation); }); });
Asignar el elemento pasado. Si el valor es un objeto (o una matriz), llame recursivamente a removeNulls
en el valor actual. Después de asignar los valores, rechace todos los valores no undefined
, null
o vacíos que no sean cadenas (consulte R.isEmpty
).
const { pipe, map, when, is, reject, ifElse, F, either, isEmpty, isNil } = R; const removeNulls = pipe( map(when(is(Object), v => removeNulls(v))), reject(ifElse(is(String), F, either(isEmpty, isNil))), ); const specimen = {"tasks":[{"id":"foo","blank":"","zero":0,"nool":null},{"nool":null},{"id":"","blank":null,"zero":0,"nool":null}],"useless":{"nool":null},"uselessArray":[{"nool":null}],"nool":null}; const result = removeNulls(specimen); console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>