如何编写递归方法过滤嵌套数组对象特定数据?当前实现输出异常
解决方案:递归筛选指定数据类型
正确实现代码
const _ = require('lodash'); function filterTargetData(data) { // 处理数组:递归筛选每个元素,仅保留符合条件的结果 if (_.isArray(data)) { const filteredItems = data .map(item => filterTargetData(item)) .filter(item => item !== undefined); // 空数组直接丢弃,否则返回筛选后的数组 return filteredItems.length > 0 ? filteredItems : undefined; } // 处理普通对象(排除数组) if (_.isObject(data)) { const resultObj = {}; _.each(data, (value, key) => { const processedValue = filterTargetData(value); // 保留两种情况:处理后有有效结果,或当前值是基本类型(非对象/数组) if (processedValue !== undefined || !_.isObject(value)) { resultObj[key] = processedValue ?? value; } }); // 两种情况保留该对象:处理后有属性,或原对象本身只有单个属性 const shouldKeep = _.size(resultObj) > 0 || _.size(data) === 1; return shouldKeep ? resultObj : undefined; } // 基本类型直接返回 return data; } // 测试用例 const userParticalData = { student: { id: 1, name: 'sankhnad', mobile: 1111111111 }, resultId: 1, address: [ { id: 1, state: 'delhi', pin: 102202 }, { id: 2 }, { id: 3, aname: 'assam', pin: 102202 } ], streem: [ { id: 1, state: 'CA', place: 'campus' } ] }; const output = filterTargetData(userParticalData); console.log(output);
现有代码的问题分析
- 直接修改原始数据:你的代码通过
delete initialData[rootKey]直接修改输入对象,不仅会污染原始数据,还会导致数组等复杂结构的处理逻辑混乱。 - 数组处理逻辑缺失:递归处理数组时,没有对数组内的元素进行筛选,也没有将筛选后的结果替换回原数组,导致
address数组里的符合条件元素没被保留。 - 类型判断不准确:
_.isObject会将数组判定为对象,你的条件没有区分数组和普通对象,导致数组被误判为需要删除的多属性对象。
正确逻辑说明
- 区分数组与普通对象:优先处理数组,遍历每个元素递归筛选,空数组直接丢弃。
- 对象筛选规则:遍历对象属性,仅保留符合条件的属性;同时如果原对象只有单个属性,无论值是什么都保留(满足“不完整对象”的要求)。
- 基本类型直接保留:所有非对象/数组的基本类型值直接保留。
- 无副作用处理:全程构建新的对象/数组,不修改原始输入数据,保证数据纯净性。
内容的提问来源于stack exchange,提问作者Sankhnad Mishra
相关产品推荐
相关产品推荐

