如何改造JS filterData函数实现嵌套结构下指定key的筛选
改造后的filterData函数实现
原代码问题说明
- 类型判断顺序错误:
typeof检测数组的结果也是'object',所以原逻辑中Array.isArray的分支永远无法触发 - 没有处理嵌套结构:无法识别外层容器对象和嵌套的目标数组,也没有递归处理深层属性
最终实现代码
function filterData(data, keys) { // 处理数组:遍历每一项递归处理 if (Array.isArray(data)) { return data.map(item => filterData(item, keys)) } // 处理对象(排除null值) if (typeof data === 'object' && data !== null) { // 判断当前对象是否包含需要保留的目标key const hasTargetKey = Object.keys(data).some(key => keys.includes(key)) if (hasTargetKey) { // 是需要过滤的目标对象,仅保留指定key const filtered = {} keys.forEach(key => { if (data.hasOwnProperty(key)) { filtered[key] = data[key] } }) return filtered } // 是上层容器对象,保留所有属性名,递归处理属性值 const processedObj = {} Object.entries(data).forEach(([key, value]) => { processedObj[key] = filterData(value, keys) }) return processedObj } // 基础类型(字符串、数字等)直接返回 return data }
逻辑说明
- 优先处理数组类型,对数组每一项递归调用处理函数,返回处理后的新数组
- 处理对象时先排除null值,再判断对象是否包含任意一个需要保留的目标key:
- 判定为目标对象(示例中的汽车对象)时,仅保留keys列表指定的属性
- 判定为容器对象(示例中badDataObject的外层对象)时,所有属性名全部保留,仅对属性值递归处理,完美适配
cars/vans/trucks这类不固定的嵌套字段名
- 字符串、数字等基础类型直接原样返回
该实现兼容任意key列表,所有测试用例输出均符合预期。
内容的提问来源于stack exchange,提问作者johnny_mac
相关产品推荐
相关产品推荐

