如何遍历JSON对象,筛选长度匹配指定值的对象/数组键?
解决JSON对象遍历中匹配指定长度的键-对象/数组问题
原代码存在的问题
- 递归参数缺失:递归调用
traverse(obj[key])时未传递size参数,导致深层遍历中size为undefined,判断逻辑完全失效 - 判断顺序错误:数组属于
typeof "object",但原代码先判断普通对象,再判断数组,导致数组的判断分支永远不会被触发 - 条件与需求不符:原代码使用
> size判断,但需求是找出长度匹配给定值(即等于size)的键值对
修正后的遍历函数
function traverse(obj, size, result = []) { for (let key in obj) { const value = obj[key]; // 跳过null,避免typeof null === 'object'的干扰 if (value === null) continue; if (typeof value === "object") { // 优先判断数组类型 if (Array.isArray(value)) { if (value.length === size) { result.push({ key, type: 'array', length: value.length }); } // 递归遍历数组内的嵌套对象/数组 traverse(value, size, result); } else { // 处理普通对象,计算键的数量作为长度 const objKeyCount = Object.keys(value).length; if (objKeyCount === size) { result.push({ key, type: 'object', length: objKeyCount }); } // 递归遍历对象的嵌套属性 traverse(value, size, result); } } } return result; }
关键改进说明
- 递归调用时传递
size参数,保证全层级判断有效 - 先判断数组类型,避免被普通对象的逻辑覆盖
- 改为收集结果返回(而非直接打印),便于后续处理
- 区分数组和对象类型,返回更清晰的匹配信息
- 跳过
null值,避免无效遍历
测试示例
以你提供的objTest对象为例,调用traverse(objTest, 3)会返回所有长度为3的数组/对象:
const matchedItems = traverse(objTest, 3); console.log(matchedItems);
输出结果:
[ { key: 'accountsInfoMessages', type: 'array', length: 3 }, { key: 'values', type: 'array', length: 3 }, { key: 'selectForCurrency', type: 'array', length: 3 } ]
如果你的实际需求是找出长度大于给定值的项,只需将判断条件中的===改为>即可。
内容的提问来源于stack exchange,提问作者Alexander Wang
相关产品推荐
相关产品推荐

