javascript - 从数组中删除空属性
问题描述
有人可以在这里帮忙吗:
- 很好地处理对象
- 但是代码在空数组中中断
const removeEmptyProperties = (obj) => {
obj = Array.isArray(obj) ? obj.filter(val => val !== 'null' || val !== 'undefined') : obj;
Object.keys(obj).forEach((key) => {
//recursive for nested objects
if (obj[key] && typeof obj[key] === 'object')
removeEmptyProperties(obj[key]);
//remove empty properties
else if (
typeof obj[key] !== 'boolean' &&
(obj[key] == null || obj[key] == '')
)
delete obj[key];
//remove empty objects
if (
typeof obj[key] !== 'boolean' &&
typeof obj[key] === 'object' &&
Object.keys(obj[key]).length == 0
)
delete obj[key];
});
};
let data = {
questionDetails: [
{
trees: 123,
template: {
id : null
}
},
{
trees: 123,
},
],
};
delete data.questionDetails[1];
removeEmptyProperties(data);
console.log(data); => { questionDetails: [ { trees: 123 }, <1 empty item> ] }
但预期结果应该是 { questionDetails: [ { trees: 123 } ] },我的代码在空数组中中断
解决方案
您可以采取一种方法,该函数为调用范围返回一个布尔值以删除属性或元素。
检查是否
value
是假的或不是一个对象。true
如果value
是不需要的值,则返回false
每个其他值。
检查是否
value
是一个数组。- 从末尾迭代数组,因为
Array#slice
更改具有更大索引的元素的索引。较小的索引不受影响。 - 使用元素调用函数
removeEmptyProperties
,splice
如果必须删除元素。 - 返回
true
一个空数组。
- 从末尾迭代数组,因为
最后你得到了一个对象。
- 获取密钥并对其进行迭代。
- 使用值调用函数
removeEmptyProperties
并删除属性,如果true
. - 返回
true
没有自己属性的对象。
最后,所有空数组/对象和不需要的属性都被删除。
const
removeEmptyProperties = value => {
if (!value || typeof value !== 'object') {
return [undefined, null, ''].includes(value);
}
if (Array.isArray(value)) {
let i = value.length;
while (i--) if (removeEmptyProperties(value[i])) value.splice(i, 1);
return !value.length;
}
Object.keys(value).forEach(k => {
if (removeEmptyProperties(value[k])) delete value[k];
});
return !Object.keys(value).length;
};
let data = { questionDetails: [{}, { id: null, foo: 0, bar: undefined }] };
removeEmptyProperties(data);
console.log(data);
data.questionDetails[0].foo = '';
removeEmptyProperties(data);
console.log(data);
推荐阅读
- sql - 在多个条件下合并
- spring - 使用 spring 下载不同的内容类型
- c - 如何从 Hashmap C 中删除一个节点
- javascript - 设置“无”而不是所需数据
- angular - 订阅 Oberservable:可以手动触发吗?
- c# - 将 ascii 字符串生成器写入文件的问题
- r - 如何从 sapply 的逻辑结果中过滤 TRUE 值?
- usb - QEMU PCI 内存映射 I/O
- php - PHP 8.0.0 高亮显示 (PhpStorm)
- java - Jackson:为什么用 @JsonFormat(shape=JsonFormat.Shape.STRING) 注释 BigDecimal 字段不起作用?