如何使用原生JavaScript动态删除复杂JSON中的空键
解决嵌套JSON中空值键的删除问题
你的问题很典型:处理JSON时能搞定平级的空键,但碰到嵌套结构就容易误删根键,还没法处理空字符串这类空值。先看看你现有代码的几个核心问题:
deleteRecord函数直接操作data[key],这只能删除根级别的键,完全没法处理嵌套对象里的键lookDeeper里的变量逻辑混乱(比如参数是key,却用item[key2]),递归层级的处理没理清楚- 空值判断不完整,没覆盖空白字符串(比如
" ")、空数组这类情况
正确的递归实现方案
我们可以写一个递归函数,遍历所有嵌套层级,区分对象和数组分别处理,同时精准判断哪些值需要被移除:
首先定义一个辅助函数,用来判断某个值是否属于需要删除的"空值":
function isEmpty(value) { // 处理 null/undefined if (value == null) return true; // 处理空字符串(包括仅含空白字符的字符串) if (typeof value === 'string' && value.trim().length === 0) return true; // 处理空数组 if (Array.isArray(value) && value.length === 0) return true; // 处理空对象(没有可枚举属性) if (typeof value === 'object' && Object.keys(value).length === 0) return true; return false; }
然后写核心的递归处理函数,统一处理所有类型的值:
function removeEmptyFields(inputJSON) { // 递归处理单个值的函数 const processValue = (value) => { // 如果是数组:先递归处理每个元素,再过滤掉空元素 if (Array.isArray(value)) { return value.map(processValue).filter(item => !isEmpty(item)); } // 如果是对象:递归处理每个属性值,只保留非空的键 if (typeof value === 'object' && value != null) { const processedObj = {}; for (const key in value) { const processedVal = processValue(value[key]); if (!isEmpty(processedVal)) { processedObj[key] = processedVal; } } return processedObj; } // 基本类型(字符串、数字等)直接返回 return value; }; // 解析输入的JSON字符串,然后递归处理 const data = JSON.parse(inputJSON); return processValue(data); }
测试你的输入
用你提供的测试数据验证一下:
const input = '{"first_name": "","last_name": "Smith","email":"jane.smith@wyng.com","gender": null,"invitations": [{"from": "test","code": ""}],"company": {"name": "dds","industries": [""]},"address": {"city": "New York","state": "NY","zip": "10011","street": " "},"new Value": ""}'; const output = removeEmptyFields(input); console.log(JSON.stringify(output, null, 2));
输出结果会是:
{ "last_name": "Smith", "email": "jane.smith@wyng.com", "invitations": [ { "from": "test" } ], "company": { "name": "dds" }, "address": { "city": "New York", "state": "NY", "zip": "10011" } }
这个方案的优势
- 递归处理所有嵌套层级:不管是对象嵌套对象、对象嵌套数组,还是数组嵌套对象,都能正确遍历处理
- 不会误删根键:只在每个嵌套层级内部删除空键/过滤空元素,根对象本身只会在它是空对象时才会被移除(符合你的需求)
- 完整的空值覆盖:包括
null、undefined、空字符串、空白字符串、空数组、空对象 - 逻辑清晰:用
processValue统一处理所有值类型,避免了变量混淆的问题
内容的提问来源于stack exchange,提问作者jengelbells
相关产品推荐
相关产品推荐

