在Groovy中返回嵌套键
我试图确定使用groovy返回嵌套键值的最佳方法。如果我有地图:在Groovy中返回嵌套键,groovy,map,nested,Groovy,Map,Nested,我试图确定使用groovy返回嵌套键值的最佳方法。如果我有地图: def map = [ OrganizationName: 'SampleTest', Address: [ Street: '123 Sample St', PostalCode: '00000', ] ] 有没有办法归还所有的钥匙组织名称,组织URL,地址.街道,地址.邮政编码?如果映射中没有映射,我可以使用map.keySet()作为字符串[]。我是否应该循环遍历每个键,看看它是否
def map = [
OrganizationName: 'SampleTest',
Address: [
Street: '123 Sample St',
PostalCode: '00000',
]
]
有没有办法归还所有的钥匙<代码>组织名称,
组织URL
,地址.街道
,地址.邮政编码
?如果映射中没有映射,我可以使用map.keySet()作为字符串[]。我是否应该循环遍历每个键,看看它是否是另一个映射的实例?groovy中没有这样的方法。您需要使用instanceof
和可能的递归方法来实现它。在groovy中没有这样的方法。您需要使用instanceof
和可能的递归方法来执行此操作。Groovy库没有为此提供方法,但您可以编写自己的方法。下面是一个可以将粘贴复制到Groovy控制台的示例
List<String> getNestedMapKeys(Map map, String keyPrefix = '') {
def result = []
map.each { key, value ->
if (value instanceof Map) {
result += getNestedMapKeys(value, keyPrefix += "$key.")
} else {
result << "$keyPrefix$key"
}
}
result
}
// test it out
def map = [
OrganizationName: 'SampleTest',
Address: [
Street: '123 Sample St',
PostalCode: '00000',
]
]
assert ['OrganizationName', 'Address.Street', 'Address.PostalCode'] == getNestedMapKeys(map)
列出getNestedMapKeys(映射映射,字符串keyPrefix=''){
def结果=[]
map.each{键,值->
if(映射的值实例){
结果+=getNestedMapKeys(值,keyPrefix+=“$key.”)
}否则{
结果Groovy库没有为此提供方法,但是您可以编写自己的方法
List<String> getNestedMapKeys(Map map, String keyPrefix = '') {
def result = []
map.each { key, value ->
if (value instanceof Map) {
result += getNestedMapKeys(value, keyPrefix += "$key.")
} else {
result << "$keyPrefix$key"
}
}
result
}
// test it out
def map = [
OrganizationName: 'SampleTest',
Address: [
Street: '123 Sample St',
PostalCode: '00000',
]
]
assert ['OrganizationName', 'Address.Street', 'Address.PostalCode'] == getNestedMapKeys(map)
列出getNestedMapKeys(映射映射,字符串keyPrefix=''){
def结果=[]
map.each{键,值->
if(映射的值实例){
结果+=getNestedMapKeys(值,keyPrefix+=“$key.”)
}否则{
结果使用以下通用递归方法生成所有嵌套映射键的列表
def getListOfKeys(def map, String prefix,def listOfKeys){
if(map instanceof Map){
map.each { key, value->
if(prefix.isEmpty()){
listOfKeys<<key
}else{
listOfKeys<< prefix+"."+key
}
if(value instanceof List){
List list = value
list.eachWithIndex { item, index ->
if(prefix.isEmpty()){
getListOfKeys(item, key+"["+index+"]",listOfKeys)
}else{
getListOfKeys(item, prefix+"."+key+"["+index+"]",listOfKeys)
}
}
}else if(value instanceof Map){
if(prefix.isEmpty()){
getListOfKeys(value, key,listOfKeys)
}else{
getListOfKeys(value, prefix+"."+key,listOfKeys)
}
}
}
}
}
输出:
listOfKeys>>>[fields,fields.project,fields.project.key,fields.summary,fields.description,fields.issuetype.name,fields.issuetype.name.Bug,fields.issuetype.name.Bug.hello,fields.issuetype.Bug.hello[0]。saurabh,fields.issuetype.name.Bug.hello[0]。om,fields.issuetype.name.Bug.hello[1].gaurav,fields.issuetype.name.Bug.hello[2].mukesh]使用以下通用递归方法生成所有嵌套映射键的列表
def getListOfKeys(def map, String prefix,def listOfKeys){
if(map instanceof Map){
map.each { key, value->
if(prefix.isEmpty()){
listOfKeys<<key
}else{
listOfKeys<< prefix+"."+key
}
if(value instanceof List){
List list = value
list.eachWithIndex { item, index ->
if(prefix.isEmpty()){
getListOfKeys(item, key+"["+index+"]",listOfKeys)
}else{
getListOfKeys(item, prefix+"."+key+"["+index+"]",listOfKeys)
}
}
}else if(value instanceof Map){
if(prefix.isEmpty()){
getListOfKeys(value, key,listOfKeys)
}else{
getListOfKeys(value, prefix+"."+key,listOfKeys)
}
}
}
}
}
输出:
listOfKeys>>>[fields,fields.project,fields.project.key,fields.summary,fields.description,fields.issuetype.name,fields.issuetype.name.Bug,fields.issuetype.name.Bug.hello,fields.issuetype.Bug.hello[0]。saurabh,fields.issuetype.name.Bug.hello[0]。om,fields.issuetype.name.Bug.hello[1].gaurav,fields.issuetype.name.Bug.hello[2].mukesh]略短一些:
String key = 'Address.Street'
key.split('\\.').inject(yourMap) {map, path -> map[path]}
如果无法保证路径存在且完整(例如,如果尝试访问OrganizationName.id
),则需要添加一些保护措施(检查映射是否为空,并且它确实是一个映射)稍微短一点:
String key = 'Address.Street'
key.split('\\.').inject(yourMap) {map, path -> map[path]}
如果您不能保证路径存在且完整(例如,如果您尝试访问OrganizationName.id
),则需要添加一些保护措施(检查映射是否为空,并且它确实是一个映射)我假设是这样,但我想我会问。谢谢!我假设是这样,但我想我会问。谢谢!更改“如果”块到:result+=getNestedMapKeys(value,keyPrefix=“$key”)
keyPrefix='
将“if”块更改为:result+=getNestedMapKeys(value,keyPrefix=“$key”)
keyPrefix='