Использование некоторых ES6 / ES2015 :
1) Простой однострочник для удаления элементов inline без присваивания:
Object.keys(myObj).forEach((key) => (myObj[key] == null) && delete myObj[key]);
jsbin
2) Этот пример был удален ...
3) Первый пример, написанный как функция:
const removeEmpty = (obj) => {
Object.keys(obj).forEach((key) => (obj[key] == null) && delete obj[key]);
}
jsbin
4) Эта функция использует рекурсию для удаления элементов также из вложенных объектов:
const removeEmpty = (obj) => {
Object.keys(obj).forEach(key => {
if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key]);
else if (obj[key] == null) delete obj[key];
});
};
jsbin
4b) Это похоже на 4), но вместо непосредственного изменения исходного объекта возвращается новый объект.
const removeEmpty = (obj) => {
const o = JSON.parse(JSON.stringify(obj)); // Clone source oect.
Object.keys(o).forEach(key => {
if (o[key] && typeof o[key] === 'object')
o[key] = removeEmpty(o[key]); // Recurse.
else if (o[key] === undefined || o[key] === null)
delete o[key]; // Delete undefined and null.
else
o[key] = o[key]; // Copy value.
});
return o; // Return new object.
};
5) функциональный подход к 4b), основанный на ответе @MichaelJ.Zoidl с использованием filter()
и reduce()
. Этот также возвращает новый объект:
const removeEmpty = (obj) =>
Object.keys(obj)
.filter(k => obj[k] !== null && obj[k] !== undefined) // Remove undef. and null.
.reduce((newObj, k) =>
typeof obj[k] === 'object' ?
Object.assign(newObj, {[k]: removeEmpty(obj[k])}) : // Recurse.
Object.assign(newObj, {[k]: obj[k]}), // Copy value.
{});
jsbin
6) То же, что и 4), но с ES7 / 2016 Object.entries()
.
const removeEmpty = (obj) =>
Object.entries(obj).forEach(([key, val]) => {
if (val && typeof val === 'object') removeEmpty(val)
else if (val == null) delete obj[key]
})
7) То же, что и 4), но в простом виде ES5 :
function removeEmpty(obj) {
Object.keys(obj).forEach(function(key) {
if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key])
else if (obj[key] == null) delete obj[key]
});
};
jsbin