Groovy列表元素解析:提取各分支首个name值并支持扩展字段
Groovy解析LUT提取首个分支对应name并支持扩展字段
一、实现基础需求:提取每个branch的首个name
核心思路是用一个Map跟踪已处理的分支,只保留每个分支第一次出现的name值。直接上代码:
def LUT = [ [branch: "test", name: 'a', image_name: 'abc'], [branch: "test", name: 'b', image_name: 'abc'], [branch: "test", name: 'c', image_name: 'abc'], [branch: "test-1", name: 'd', image_name: 'abc'], [branch: "test-1", name: 'e', image_name: 'abc'], [branch: "test-2", name: 'f', image_name: 'abc'], [branch: "test-2", name: 'g', image_name: 'abc'], [branch: "test-2", name: 'h', image_name: 'abc'], [branch: "test-3", name: 'i', image_name: 'abc'], [branch: "test-3", name: 'j', image_name: 'abc'], [branch: "test-4", name: 'k', image_name: 'abc'], [branch: "test-5", name: 'l', image_name: 'abc'], ] def result = [:] LUT.each { entry -> def branch = entry.branch // 仅当分支未被处理过时,存储首个name if (!result.containsKey(branch)) { result[branch] = [[name: entry.name]] } } println result
运行这段代码后,就能得到你期望的基础结果:每个分支对应一个包含首个name的列表。
二、为指定分支添加额外字段
有两种灵活的实现方式,你可以根据场景选择:
方式1:生成结果时直接添加字段
如果提前知道哪些分支需要扩展,可以在初始化结果时直接处理:
def result = [:] LUT.each { entry -> def branch = entry.branch if (!result.containsKey(branch)) { def nameEntry = [name: entry.name] // 针对test-1分支添加新字段,甚至修改name值 if (branch == "test-1") { nameEntry.new_name = "new" // 如果需要把name改成"a",就加这句:nameEntry.name = "a" } result[branch] = [nameEntry] } } println result
方式2:生成基础结果后动态修改
如果后续才确定要扩展的分支,或者需要动态调整,可以先生成基础结果,再单独修改指定分支:
// 先生成基础结果(和第一步代码一致) def result = [:] LUT.each { entry -> def branch = entry.branch if (!result.containsKey(branch)) { result[branch] = [[name: entry.name]] } } // 对test-1分支添加新字段,或者修改现有字段 result["test-1"][0].new_name = "new" // 要是需要修改name值:result["test-1"][0].name = "a" println result
这两种方式都能实现你想要的"test-1": [{ "name":"a", "new_name":"new" }]这类效果,按需选用即可。
内容的提问来源于stack exchange,提问作者Asar




