JavaScript数组遍历过滤空属性的核心是先遍历对象再判断属性是否为空,常见空值包括null、undefined、''、[]、{},0和false需按业务决定;可用Object.fromEntries+filter清洗单个对象,filter方法筛选有效对象,递归函数处理嵌套结构。

JavaScript 数组遍历中过滤掉对象的空属性,核心是:先遍历数组中的每个对象,再对每个对象的属性做“是否为空”的判断,最后保留不为空的属性(或整个对象)。关键在于明确定义什么是“空属性”——常见包括 null、undefined、空字符串 ''、空数组 []、空对象 {},有时也包括 0 和 false(需按业务决定是否排除)。
只保留对象中非空属性(精简单个对象)
适用于需要清洗单个对象字段的场景,比如提交前清理表单数据。
用 Object.entries() + filter() + Object.fromEntries() 组合:
function cleanEmptyProps(obj) {
return Object.fromEntries(
Object.entries(obj).filter(([_, value]) => {
if (value === null || value === undefined) return false;
if (typeof value === 'string') return value.trim() !== '';
if (Array.isArray(value)) return value.length > 0;
if (typeof value === 'object') return Object.keys(value).length > 0;
return Boolean(value); // 包含 true, 非零数字等;若想保留 0 或 false,此处单独判断
})
);
}
// 示例
const user = { name: ' ', age: 0, city: 'Beijing', tags: [], profile: {} };
console.log(cleanEmptyProps(user));
// → { city: 'Beijing' }
过滤整个对象(跳过含空关键字段的对象)
适用于数组中某些对象因必填字段为空而应被剔除,比如筛选有效用户。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
常用 Array.prototype.filter(),配合自定义“对象是否有效”逻辑:
- 指定关键字段(如
name、email),任一为空则过滤 - 或要求所有字段都不能为空(较严格)
示例(只要 name 和 email 都非空才保留):
const users = [
{ name: 'Alice', email: 'a@example.com' },
{ name: '', email: 'b@example.com' },
{ name: 'Bob', email: null }
];
const validUsers = users.filter(u =>
u.name && u.name.trim() && u.email && typeof u.email === 'string' && u.email.trim()
);
// → [{ name: 'Alice', email: 'a@example.com' }]
深层过滤:递归清理嵌套对象和数组
当对象含嵌套结构(如 address: { street: '', zip: '10001' }),需递归处理。
简单递归函数示例(跳过空值,不修改原对象):
function deepClean(obj) {
if (obj === null || obj === undefined) return undefined;
if (typeof obj === 'string') return obj.trim() === '' ? undefined : obj;
if (Array.isArray(obj)) {
const cleaned = obj.map(deepClean).filter(v => v !== undefined);
return cleaned.length ? cleaned : undefined;
}
if (typeof obj === 'object') {
const entries = Object.entries(obj)
.map(([k, v]) => [k, deepClean(v)])
.filter(([, v]) => v !== undefined);
return entries.length ? Object.fromEntries(entries) : undefined;
}
return obj; // number, boolean, symbol 等原样返回
}
// 使用
const data = {
id: 1,
name: ' ',
tags: ['', 'js', null],
meta: { a: '', b: 42, c: {} }
};
console.log(deepClean(data));
// → { id: 1, tags: ['js'], meta: { b: 42 } }
注意事项与常见坑
-
空字符串 vs 空格字符串:用
str.trim() === ''判断更稳妥 - 0、false、NaN 的取舍:它们是 falsy 值,但可能是合法数据(如年龄=0、启用=false),务必按业务语义判断
-
引用类型比较:
[] === []是false,判断空数组要用Array.isArray(x) && x.length === 0 - 避免修改原数组/对象:上述方法均返回新结构,如需原地修改需另写逻辑(不推荐)

















