我正在阅读一个带有类别树的表。现在我需要获得一个类别为name
,id
和parentname
的输出,但我无法弄清楚如何获取父级的名称。
def collect(path, item) {
def line = item.id_ShopCOM + "|" + item.parent_guid + "|" + item.caption_ShopCOM
outfile += line +"\n"
println(line )
x++
}
这样我可以获得parent_guid (Database ID)
,但是如何在此循环中访问父级的名称?
答案 0 :(得分:1)
由于循环迭代只处理一个项目,因此访问父项数据的唯一方法是进行查找。您可以根据需要随时进行查找,也可以预先处理查找数据。
这是一个仅限Groovy的模拟。你有一个项目列表,基本上你从数据库中获得了什么。它实现为List<Map>
。
def tree = [
[id: 1, parent: 3, name: 'root'],
[id: 2, parent: 4, name: 'john'],
[id: 3, parent: null, name: '/'],
[id: 4, parent: 3, name: 'home']
]
上面的示例数据是* NIX目录/,/ root,/ home和/ home / john。
查找将按项目ID进行,这是Map
的合适人选。因此List<Map>
转换为Map<Map>
。
def treeMap = tree.inject([:]) {map, item ->
map[item.id] = item - [id: item.id]
map
}
Map
看起来像这样:
[
1:[parent:3, name:'root'],
2:[parent:4, name:'john'],
3:[parent:null, name:'/'],
4:[parent:3, name:'home']
]
现在,您可以选择是在运行中还是从预处理Map
进行父查找。
使用即时查找,您只需遍历treeMap
,并在每次迭代中使用相同的treeMap
查找父项的数据。
treeMap.each {id, item ->
println "$id|$item.parent|$item.name|${treeMap[item.parent]?.name}"
}
使用预处理的Map
,您基本上将父母的ID替换为父级的数据。警告,您可能需要重新输入ID。
treeMap = treeMap.collectEntries {id, item ->
def parent = treeMap[item.parent]
if(parent) parent.id = item.parent // Putting the ID back in.
def newItem = item << [parent: parent]
[(id): newItem]
}
treeMap.each {id, item ->
println "$id|${item.parent?.id}|$item.name|${item.parent?.name}"
}
无论哪种方式,输出都是相同的:
1|3|root|/
2|4|john|home
3|null|/|null
4|3|home|/