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

Groovy中如何遍历嵌套对象提取指定name对应的matrix_value?

Groovy递归提取嵌套对象的matrix_value

需求说明

我在Groovy中拥有一个嵌套结构的对象列表,需要根据指定的name值,匹配顶层对象或其子对象(children字段中的元素),并提取对应的matrix_value。当前代码仅能检索顶层对象的matrix_value,需修改以支持递归查找嵌套的子对象。

对象结构示例

[{"id":null,"dimension":"f7f04751-5ac9-4867-a742-6f69a53d99d3","matrix_value":"ac726cd4-0aaf-4b4b-91c1-bceda8dded04","name":"Linear","include":false,"children":[{"id":null,"dimension":"f7f04751-5ac9-4867-a742-6f69a53d99d3","matrix_value":"efc05bdb-ebc8-4167-85fb-9e5a63a1200b","name":"Little Linear","include":false,"children":[]}]},{"id":null,"dimension":"f7f04751-5ac9-4867-a742-6f69a53d99d3","matrix_value":"a2b932d3-14f0-480f-8eeb-d1fc00a1c7ab","name":"Not Linear","include":false,"children":[]}]

原代码(仅支持顶层查找)

import groovy.json.JsonSlurper;

def Dimensions = vars.getObject("Dimensions")

String[] DimensionKeyset = vars.getObject("DimensionKeySet");
String Dimension_name = DimensionKeyset[Integer.parseInt(vars.get("ContoDimensions"))]
String[] Values = Dimensions.get(Dimension_name)
def Body = vars.get("Body_Get")
def jsonSlurper = new JsonSlurper();
def list = jsonSlurper.parseText(Body);
def rc_dimension_values = []
log.info("La lista è: "+ list.toString())

log.info("La vera lista è: "+ list.getClass())

for(v : Values) {
    rc_dimension_values += list.find { it.name.trim() == v.trim() }.matrix_value
    log.info("L'oggetto è:" + list.find { it.name.trim() == v.trim() } )
    log.info("Check For Values: " + v)
}

def builder = new groovy.json.JsonBuilder(rc_dimension_values)

vars.put("rc_dimension_values", builder.toString());

修改后的代码(支持递归查找)

核心是添加递归函数,遍历顶层对象及其所有子对象,找到匹配name的元素并返回对应的matrix_value:

import groovy.json.JsonSlurper;

def Dimensions = vars.getObject("Dimensions")

String[] DimensionKeyset = vars.getObject("DimensionKeySet");
String Dimension_name = DimensionKeyset[Integer.parseInt(vars.get("ContoDimensions"))]
String[] Values = Dimensions.get(Dimension_name)
def Body = vars.get("Body_Get")
def jsonSlurper = new JsonSlurper();
def list = jsonSlurper.parseText(Body);
def rc_dimension_values = []

// 递归查找函数:遍历对象列表及所有子对象,匹配目标name并返回对应的matrix_value
def findMatrixValueByName(items, targetName) {
    for (item in items) {
        // 匹配当前对象的name
        if (item.name.trim() == targetName.trim()) {
            return item.matrix_value
        }
        // 若有非空子对象,递归查找
        if (item.children && !item.children.isEmpty()) {
            def childResult = findMatrixValueByName(item.children, targetName)
            if (childResult) {
                return childResult
            }
        }
    }
    return null // 未找到时返回null
}

log.info("La lista è: "+ list.toString())
log.info("La vera lista è: "+ list.getClass())

for(v : Values) {
    def foundValue = findMatrixValueByName(list, v)
    if (foundValue) {
        rc_dimension_values.add(foundValue)
        log.info("找到匹配值: " + foundValue + " 对应name: " + v)
    } else {
        log.info("未找到匹配name: " + v)
    }
}

def builder = new groovy.json.JsonBuilder(rc_dimension_values)
vars.put("rc_dimension_values", builder.toString());

关键修改点

  • 新增findMatrixValueByName递归函数,覆盖顶层对象和所有嵌套子对象的查找
  • 优先检查当前对象的name是否匹配,匹配则直接返回对应的matrix_value
  • 若当前对象存在非空children,则递归调用函数查找子对象
  • 循环中调用递归函数替代原有的list.find,确保能处理所有嵌套层级

内容的提问来源于stack exchange,提问作者Michele Scianatico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:43:21