Here is a comprehensive recursive function (originally based on the one by @chickens) that will:
defaults=[undefined, null, '', NaN]
const cleanEmpty = function(obj, defaults = [undefined, null, NaN, '']) {
if (!defaults.length) return obj
if (defaults.includes(obj)) return
if (Array.isArray(obj))
return obj
.map(v => v && typeof v === 'object' ? cleanEmpty(v, defaults) : v)
.filter(v => !defaults.includes(v))
return Object.entries(obj).length
? Object.entries(obj)
.map(([k, v]) => ([k, v && typeof v === 'object' ? cleanEmpty(v, defaults) : v]))
.reduce((a, [k, v]) => (defaults.includes(v) ? a : { ...a, [k]: v}), {})
: obj
}
USAGE:
// based off the recursive cleanEmpty function by @chickens. _x000D_
// This one can also handle Date objects correctly _x000D_
// and has a defaults list for values you want stripped._x000D_
_x000D_
const cleanEmpty = function(obj, defaults = [undefined, null, NaN, '']) {_x000D_
if (!defaults.length) return obj_x000D_
if (defaults.includes(obj)) return_x000D_
_x000D_
if (Array.isArray(obj))_x000D_
return obj_x000D_
.map(v => v && typeof v === 'object' ? cleanEmpty(v, defaults) : v)_x000D_
.filter(v => !defaults.includes(v))_x000D_
_x000D_
return Object.entries(obj).length _x000D_
? Object.entries(obj)_x000D_
.map(([k, v]) => ([k, v && typeof v === 'object' ? cleanEmpty(v, defaults) : v]))_x000D_
.reduce((a, [k, v]) => (defaults.includes(v) ? a : { ...a, [k]: v}), {}) _x000D_
: obj_x000D_
}_x000D_
_x000D_
_x000D_
// testing_x000D_
_x000D_
console.log('testing: undefined \n', cleanEmpty(undefined))_x000D_
console.log('testing: null \n',cleanEmpty(null))_x000D_
console.log('testing: NaN \n',cleanEmpty(NaN))_x000D_
console.log('testing: empty string \n',cleanEmpty(''))_x000D_
console.log('testing: empty array \n',cleanEmpty([]))_x000D_
console.log('testing: date object \n',cleanEmpty(new Date(1589339052 * 1000)))_x000D_
console.log('testing: nested empty arr \n',cleanEmpty({ 1: { 2 :null, 3: [] }}))_x000D_
console.log('testing: comprehensive obj \n', cleanEmpty({_x000D_
a: 5,_x000D_
b: 0,_x000D_
c: undefined,_x000D_
d: {_x000D_
e: null,_x000D_
f: [{_x000D_
a: undefined,_x000D_
b: new Date(),_x000D_
c: ''_x000D_
}]_x000D_
},_x000D_
g: NaN,_x000D_
h: null_x000D_
}))_x000D_
console.log('testing: different defaults \n', cleanEmpty({_x000D_
a: 5,_x000D_
b: 0,_x000D_
c: undefined,_x000D_
d: {_x000D_
e: null,_x000D_
f: [{_x000D_
a: undefined,_x000D_
b: '',_x000D_
c: new Date()_x000D_
}]_x000D_
},_x000D_
g: [0, 1, 2, 3, 4],_x000D_
h: '',_x000D_
}, [undefined, null]))
_x000D_