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

如何过滤不同层级嵌套的JSON键值?解决JS语法报错问题

解决JavaScript中无法使用JSONPath .. 语法的问题

你遇到的核心问题是JavaScript原生不支持JSONPath的..递归下降语法,直接在JS代码里写o..name属于非法语法,因此触发了SyntaxError。

错误代码与报错回顾

你尝试执行的代码:

var testcaseArray = response.collection.item.filter(o => o..name.includes(/^(RD-T|RES-T)/));

对应的报错信息:

org.graalvm.polyglot.PolyglotException: SyntaxError: Unnamed:1:59 Expected ident but found .
var testcaseArray = response.collection.item.filter(o => o..name.includes(/^(RD-T|RES-T)/))

原生JavaScript解决方案

要在多层嵌套的对象中查找目标字段,你可以自己写一个递归函数遍历所有层级,判断是否存在符合条件的name字段:

  1. 定义递归辅助函数,检查对象所有层级:
function hasTargetName(obj, pattern) {
    // 检查当前对象是否有匹配的name字段
    if (obj.name && pattern.test(obj.name)) {
        return true;
    }
    // 遍历所有属性,递归检查嵌套对象
    for (const key in obj) {
        if (typeof obj[key] === 'object' && obj[key] !== null) {
            if (hasTargetName(obj[key], pattern)) {
                return true;
            }
        }
    }
    return false;
}
  1. 用该函数替代原逻辑完成过滤:
var testcaseArray = response.collection.item.filter(o => hasTargetName(o, /^(RD-T|RES-T)/));

扩展:提取所有匹配的name值

如果需要收集所有符合条件的name内容,而非仅判断存在性,可以修改辅助函数:

function collectTargetNames(obj, pattern, results = []) {
    if (obj.name && pattern.test(obj.name)) {
        results.push(obj.name);
    }
    for (const key in obj) {
        if (typeof obj[key] === 'object' && obj[key] !== null) {
            collectTargetNames(obj[key], pattern, results);
        }
    }
    return results;
}

内容的提问来源于stack exchange,提问作者Adrian Alan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:32:59