如何在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
相关产品推荐
相关产品推荐

