如何过滤不同层级嵌套的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字段:
- 定义递归辅助函数,检查对象所有层级:
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; }
- 用该函数替代原逻辑完成过滤:
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
相关产品推荐
相关产品推荐

