如何用JavaScript递归函数获取带层级的空/Null/Undefined字段?
递归提取对象中空值字段并保留层级结构
问题场景
需要从嵌套对象中提取所有值为""、null或undefined的字段,同时完整保留原有的层级结构,而非扁平化结果。
解决方案代码
function getEmptyFields(obj) { const result = {}; for (const key in obj) { if (!obj.hasOwnProperty(key)) continue; const value = obj[key]; const isTargetEmpty = value === "" || value === null || value === undefined; // 处理嵌套对象 if (typeof value === "object" && value !== null) { const nestedEmptyFields = getEmptyFields(value); // 仅当嵌套结果非空时才加入,避免冗余空对象 if (Object.keys(nestedEmptyFields).length > 0) { result[key] = nestedEmptyFields; } } // 处理目标空值字段 else if (isTargetEmpty) { result[key] = value; } } return result; }
代码说明
- 初始化结果容器:创建空对象
result存储最终的层级化结果。 - 遍历对象属性:使用
for...in遍历对象,通过hasOwnProperty过滤原型链属性,只处理对象自身字段。 - 空值判断:定义
isTargetEmpty标识当前值是否为需要提取的空值类型。 - 递归处理嵌套对象:如果当前值是对象且不为
null,递归调用函数处理嵌套对象;只有当递归返回的结果非空时,才将其添加到result中,避免生成无意义的空对象。 - 收集目标字段:如果当前值是目标空值,直接将键值对加入
result。
示例测试
输入对象
const sampleData = { name: "", age: null, address: { street: undefined, city: "New York", zip: "" }, contacts: { email: "test@example.com", phone: null } };
调用函数
const emptyFields = getEmptyFields(sampleData); console.log(emptyFields);
输出结果
{ name: "", age: null, address: { street: undefined, zip: "" }, contacts: { phone: null } }
该实现完美保留了原对象的层级结构,仅保留符合条件的空值字段。
内容的提问来源于stack exchange,提问作者Grewal
相关产品推荐
相关产品推荐

