javascript - 如何从对象中删除未定义的属性和从数组中删除元素
问题描述
我有以下对象:
{
a: {
b: {
c: undefined
}
},
b: {
c: 15,
d: []
},
c: {
d: [11, undefined ,12],
e: {}
}
}
我需要得到这个:
{
b: {
c: 15
},
c: {
d: [11, 12]
}
}
我找到了这个函数(来源:从对象中删除未定义的属性)
function filter(obj) {
for (var key in obj) {
if (obj[key] === undefined) {
delete obj[key];
continue;
}
if (obj[key] && typeof obj[key] === "object") {
filter(obj[key]);
if (!Object.keys(obj[key]).length) {
delete obj[key];
}
}
}
return obj;
}
但它只是删除数组的元素,结果如下
{
b: {
c: 15
},
c: {
d: [11, empty ,12]
}
}
解决方案
您需要一个递归解决方案。创建一个函数,如果它的值是假的,或者它的所有递归元素都是假的或空数组或没有键,则它接受一个值并返回假的东西:
const removeRecursive = (obj) => {
// Falsey primitive, including null:
if (!obj) return;
// Truthy primitive (or function):
if (typeof obj !== 'object') return obj;
// Array, transform all values and return the new array
// if there are any truthy transformed values:
if (Array.isArray(obj)) {
const newArr = obj.map(removeRecursive).filter(Boolean);
return newArr.length ? newArr : undefined;
}
// Otherwise, it's an object:
const newObj = Object.fromEntries(
Object.entries(obj)
.map(([key, val]) => ([key, removeRecursive(val)]))
.filter(([, val]) => val)
);
if (Object.keys(newObj).length) {
return newObj;
}
};
const obj = {
a: {
b: {
c: undefined
}
},
b: {
c: 15,
d: []
},
c: {
d: [11, undefined ,12],
e: {}
}
};
console.log(removeRecursive(obj));
推荐阅读
- laravel - AWS 中的数据库连接有时会丢失
- r - Rmarkdown nocite 不显示 pdf 中的引文
- javascript - 这个 indexOf 查询不起作用是有原因的吗?
- python-3.x - 有没有办法将 spacy 训练的模型加载到 gensim 中?
- ansible - Ansible become 报告成功,但由于缺少权限,命令失败
- mongodb - 我在 Jmeter 中的 groovy 脚本执行没有错误,但无法在 Mongo DB 中插入文档,这可能是什么问题?
- python - 读取另一个文件的每一行后更快地填充文件的方法
- laravel - 未设置/存储 Httponly cookie (Laravel / Vue)
- react-native - 如何在本机反应中禁用已经选择的开始日期和结束日期的日期
- laravel-5 - Laravel 自定义属性影响数据插入到 db