如何删除JavaScript对象中未定义或空的所有属性?
(这个问题与数组的问题类似)
如何删除JavaScript对象中未定义或空的所有属性?
(这个问题与数组的问题类似)
当前回答
最简单的Lodash解决方案返回一个过滤掉空值和未定义值的对象。
_.omitBy(obj, _.isNil)
其他回答
您可以使用json在一行中进行递归删除。Stringify的replacer参数
const removeEmptyValues = obj => (
JSON.parse(JSON.stringify(obj, (k,v) => v ?? undefined))
)
用法:
removeEmptyValues({a:{x:1,y:null,z:undefined}}) // Returns {a:{x:1}}
正如Emmanuel的评论中提到的,只有当数据结构只包含可以放入JSON格式的数据类型(字符串、数字、列表等)时,这种技术才有效。
(此答案已更新为使用新的Nullish Coalescing运算符。根据浏览器的支持需要,你可能想要使用这个函数代替:(k,v) => v!=零?V:未定义)
这是我对鸡肉功能的看法
这将从对象或对象数组中删除空字符串、未定义、null,并且不影响Date对象
const removeEmpty = obj => {
if (Array.isArray(obj)) {
return obj.map(v => (v && !(v instanceof Date) && typeof v === 'object' ? removeEmpty(v) : v)).filter(v => v)
} else {
return Object.entries(obj)
.map(([k, v]) => [k, v && !(v instanceof Date) && typeof v === 'object' ? removeEmpty(v) : v])
.reduce((a, [k, v]) => (typeof v !== 'boolean' && !v ? a : ((a[k] = v), a)), {})
}
}
如果你正在使用lodash或underscore.js,这里有一个简单的解决方案:
var obj = {name: 'John', age: null};
var compacted = _.pickBy(obj);
这将只适用于lodash 4,预lodash 4或下划线。js,使用_。选择(obj _.identity);
如果你不想原地改变,而是返回一个删除了null/undefined的克隆,你可以使用ES6的reduce函数。
// Helper to remove undefined or null properties from an object
function removeEmpty(obj) {
// Protect against null/undefined object passed in
return Object.keys(obj || {}).reduce((x, k) => {
// Check for null or undefined
if (obj[k] != null) {
x[k] = obj[k];
}
return x;
}, {});
}
如果有人需要欧文(和埃里克)答案的递归版本,这里是:
/**
* Delete all null (or undefined) properties from an object.
* Set 'recurse' to true if you also want to delete properties in nested objects.
*/
function delete_null_properties(test, recurse) {
for (var i in test) {
if (test[i] === null) {
delete test[i];
} else if (recurse && typeof test[i] === 'object') {
delete_null_properties(test[i], recurse);
}
}
}