object.assign本身不支持清除空属性,需结合object.entries、filter和reduce实现优雅清理;常见空值包括null、undefined、空字符串、空数组、空对象,但0和false通常应保留。

Object.assign 本身不提供“清除空属性”的能力,它只是浅拷贝属性。要优雅清除对象中的空值(如 null、undefined、空字符串 ''、空数组 []、空对象 {} 等),需结合过滤逻辑 —— 但可以借助 Object.assign 配合 Object.entries 和 reduce 实现简洁、函数式风格的清理。
明确“空属性”的判断标准
不同业务对“空”的定义不同。常见需过滤的值包括:
-
null和undefined - 空字符串
'' - 空数组
[](注意:Array.isArray(val) && val.length === 0) - 空对象
{}(注意:typeof val === 'object' && val !== null && Object.keys(val).length === 0) - 数值
0或布尔值false通常**不应被误删**,除非业务明确要求
推荐写法:用 Object.entries + filter + reduce 构建新对象
这是最清晰、可读性高且不修改原对象的方式(符合函数式编程习惯):
const cleanEmpty = (obj) => {
const isEmpty = (val) => {
if (val == null) return true;
if (typeof val === 'string') return val.trim() === '';
if (Array.isArray(val)) return val.length === 0;
if (typeof val === 'object') return Object.keys(val).length === 0;
return false;
};
return Object.entries(obj)
.filter(([, value]) => !isEmpty(value))
.reduce((acc, [key, value]) => ({
...acc,
[key]: value
}), {});
};
// 使用示例
const data = {
name: ' ',
age: 25,
tags: [],
meta: {},
email: 'user@example.com',
note: null,
active: false // 保留,因 false 是有效业务值
};
console.log(cleanEmpty(data));
// → { age: 25, email: 'user@example.com', active: false }
若坚持用 Object.assign:配合解构与条件展开
适用于已知键名、且空值较少的场景,语法更紧凑但扩展性弱:
const { name, tags, meta, ...rest } = data;
const cleaned = Object.assign(
{},
name?.trim() && { name },
tags?.length && { tags },
!(meta && typeof meta === 'object' && Object.keys(meta).length === 0) && { meta },
rest
);
⚠️ 注意:这种写法易出错、难维护,仅建议用于简单、固定结构的对象。
进阶:支持嵌套对象的深度清理(可选)
若需递归清理嵌套空值,Object.assign 就不再适用;应改用递归函数:
const deepCleanEmpty = (obj) => {
if (obj == null || typeof obj !== 'object') return obj;
if (Array.isArray(obj)) {
return obj.map(deepCleanEmpty).filter(v => v != null || typeof v === 'boolean' || v === 0);
}
const cleaned = {};
for (const [k, v] of Object.entries(obj)) {
const cleanedVal = deepCleanEmpty(v);
if (!(cleanedVal == null ||
(typeof cleanedVal === 'string' && cleanedVal.trim() === '') ||
(Array.isArray(cleanedVal) && cleanedVal.length === 0) ||
(typeof cleanedVal === 'object' && cleanedVal !== null && Object.keys(cleanedVal).length === 0))) {
cleaned[k] = cleanedVal;
}
}
return cleaned;
};
真正“优雅”的关键不是强行套用 Object.assign,而是选择语义清晰、易于测试和复用的方式。对于大多数场景,Object.entries + filter + reduce 组合已足够简洁有力。










