嵌套对象空值键过滤异常:递归方法未处理嵌套层级
如何递归过滤对象中值为空字符串的键(含嵌套对象)
问题场景
我需要过滤对象中值为空字符串('')的键,嵌套对象内的空值键也需一并过滤。但当前的TypeScript方法仅能处理父级对象的空值键,嵌套对象里的空值键无法被过滤。
输入示例
const obje = { a:'a', b:'', c:'c', d: { e:'e', f:'', g:'', h:'' } }
期望输出
const obje = { a:'a', c:'c', d: { e:'e', } }
当前代码及问题
filterKeys(obj: any) { return Object.fromEntries( Object.entries(obj).filter(([key, value]) => { return typeof value !== 'object' ? value !== '' : this.filterKeys(obj[key]); }), ); }
实际输出的嵌套对象仍保留空值键:
const obje = { a:'a', c:'c', d: { e:'e', f:'', g:'', h:'' } }
问题原因分析
- 递归逻辑错误:处理嵌套对象时,
filter回调返回了递归后的对象(而非布尔值)。filter需要布尔值判断是否保留当前键,因此只要嵌套对象不为空,就会保留原对象,而非替换成过滤后的版本。 - 未处理
null边界:typeof null === 'object',若值为null会错误进入递归流程。 - 参数误用:递归时使用
obj[key]而非直接用value,写法不严谨。
修正后的代码
filterKeys(obj: any): any { // 边界处理:非对象/直接返回原值 if (typeof obj !== 'object' || obj === null) { return obj; } return Object.fromEntries( Object.entries(obj) // 第一步:过滤空字符串,同时判断嵌套对象过滤后是否需保留 .filter(([_, value]) => { if (value === '') return false; if (typeof value === 'object' && value !== null) { const filteredNested = this.filterKeys(value); // 若过滤后嵌套对象为空,可选择不保留该键(按需调整) return Object.keys(filteredNested).length > 0; } return true; }) // 第二步:替换嵌套对象为过滤后的版本 .map(([key, value]) => { if (typeof value === 'object' && value !== null) { return [key, this.filterKeys(value)]; } return [key, value]; }) ); }
修正说明
- 边界判断:先排除非对象和
null的情况,避免递归出错。 - 拆分逻辑:先通过
filter剔除空字符串键,对嵌套对象先递归过滤,再决定是否保留该键(若过滤后嵌套对象为空,会自动剔除)。 - 替换嵌套对象:通过
map将原嵌套对象替换为过滤后的版本,确保内层空值键被处理。
内容的提问来源于stack exchange,提问作者Maulik Dikshit
相关产品推荐
相关产品推荐

