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

如何在JavaScript中移除JSON对象数组内的<1 empty item>空项

JSON清理:移除数组中的空项问题

原始JSON对象:

{
  name: { first: 'Robert', middle: '', last: 'Smith' },
  age: 25,
  DOB: '-',
  hobbies: [ 'running', 'coding', '-' ],
  education: { highschool: 'N/A', college: 'Yale' }
}

尝试移除值为-、N/A及空字符串""的内容后,数组里残留了<1 empty item>空项:

{
  name: { first: 'Robert', last: 'Smith' },
  age: 25,
  hobbies: [ 'running', 'coding', <1 empty item> ],
  education: { college: 'Yale' }
}

以下是我写的JavaScript代码,请问怎么修改才能移除数组里的这个空项?

axios.get("https://coderbyte.com/api/challenges/json/json-cleaning")
  .then((res) => {
    let parseData = res.data;

    const removeValue = (obj) => {
      Object.keys(obj).forEach(k => 
        
        // console.log(obj[k])
        (obj[k] && obj[k] === "-") && 
        delete obj[k] ||

        (obj[k] && typeof obj[k] === 'object')
        && removeValue(obj[k]) || 
        
        (!obj[k] && obj[k] !== undefined) && 
        delete obj[k] || 
        
        (obj[k] && obj[k] === "N/A") && 
        delete obj[k]


      );
      return obj
    }

    newData = removeValue(parseData)

    console.log(newData)
  })
解决方案

你的问题出在处理数组时使用了delete操作——delete只会将数组对应索引位置的值设为undefined,不会重新编排数组索引,因此会留下空占位符(也就是你看到的<1 empty item>)。要彻底移除这些空项,需要单独对数组做过滤处理,而不是用delete。

修改后的removeValue函数如下:

const removeValue = (obj) => {
  // 优先处理数组:过滤掉需要移除的元素
  if (Array.isArray(obj)) {
    return obj.filter(item => {
      // 若元素是对象或数组,先递归清理再判断是否保留
      if (item && typeof item === 'object') {
        const cleanedItem = removeValue(item);
        // 处理后的数组非空/对象有键则保留
        return Array.isArray(cleanedItem) ? cleanedItem.length > 0 : Object.keys(cleanedItem).length > 0;
      }
      // 过滤掉指定的无效值
      return !["-", "N/A", "", undefined, null].includes(item);
    });
  }

  // 处理普通对象
  if (obj && typeof obj === 'object') {
    Object.keys(obj).forEach(k => {
      const value = obj[k];
      // 统一判断是否需要移除当前值
      const shouldRemove = ["-", "N/A", "", undefined, null].includes(value);
      
      if (shouldRemove) {
        delete obj[k];
      } else if (typeof value === 'object') {
        // 递归处理嵌套结构,处理后为空则删除父键
        const cleanedValue = removeValue(value);
        if ((Array.isArray(cleanedValue) && cleanedValue.length === 0) || 
            (!Array.isArray(cleanedValue) && Object.keys(cleanedValue).length === 0)) {
          delete obj[k];
        } else {
          obj[k] = cleanedValue;
        }
      }
    });
  }

  return obj;
}

关键修改说明:

  • 优先识别数组类型:用Array.isArray(obj)先判断是否为数组,直接调用filter过滤无效元素,彻底删除空项,不会留下占位符。
  • 递归处理嵌套结构:数组元素如果是对象或数组,先递归清理内部内容,再判断处理后的结果是否为空(空对象/空数组直接过滤)。
  • 统一无效值判断:把所有需要移除的值("-"、"N/A"、""、undefined、null)放到一个数组中,用includes统一判断,逻辑更简洁。
  • 清理空嵌套结构:处理完嵌套对象/数组后,如果结果为空(比如某个对象的所有键都被删除),直接删除对应的父键,避免残留空结构。

将原代码中的removeValue函数替换为上述版本,即可得到无空项的干净JSON结构。

内容的提问来源于stack exchange,提问作者Auvee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:15:50