You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历JSON对象,筛选长度匹配指定值的对象/数组键?

解决JSON对象遍历中匹配指定长度的键-对象/数组问题

原代码存在的问题

  1. 递归参数缺失:递归调用traverse(obj[key])时未传递size参数,导致深层遍历中size为undefined,判断逻辑完全失效
  2. 判断顺序错误:数组属于typeof "object",但原代码先判断普通对象,再判断数组,导致数组的判断分支永远不会被触发
  3. 条件与需求不符:原代码使用> 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:30:34