如何检查数组中所有元素(含嵌套结构)是否为空或未定义?
解决方案
原代码存在的问题
- 拼写错误:
items.lenght应为items.length,导致循环无法正常执行 - 类型覆盖不全:仅处理了顶层对象,完全忽略了数组类型的元素
- 未处理嵌套结构:无法检查嵌套数组、嵌套对象的空值情况,比如
{ nested: [] }会被误判为非空 - 逻辑反向:原代码在对象为空时将
validation设为false,与需求逻辑相反(需求是元素已定义但内部不全为空时才验证失败)
实现完整检查的代码
首先定义递归辅助函数,用于判断任意值(包括嵌套结构)是否为空:
function isEmpty(value) { // 处理 null、undefined if (value == null) return true; // 空字符串(可根据需求决定是否保留此判断) if (typeof value === 'string') return value.trim().length === 0; // 数组:递归检查每个元素是否都为空 if (Array.isArray(value)) { return value.every(item => isEmpty(item)); } // 对象:递归检查所有属性值是否都为空 if (typeof value === 'object') { return Object.values(value).every(val => isEmpty(val)); } // 其他类型(数字、布尔等)默认非空 return false; }
然后用该函数检查目标数组:
// 遍历版本 let validation = true; for (let i = 0; i < items.length; ++i) { const item = items[i]; // 元素不是undefined,且内部不全为空时,验证失败 if (item !== undefined && !isEmpty(item)) { validation = false; break; } } // 更简洁的数组every方法版本 // const validation = items.every(item => item === undefined || isEmpty(item));
代码说明
isEmpty函数递归处理所有数据类型,确保深层嵌套的数组、对象都能被检查- 主逻辑验证数组中每个元素:要么是
undefined,要么是内部所有元素全为空的结构,符合要求则validation为true,否则为false
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

