You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用原生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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:55:08