在Groovy中返回嵌套键

在Groovy中返回嵌套键,groovy,map,nested,Groovy,Map,Nested,我试图确定使用groovy返回嵌套键值的最佳方法。如果我有地图: def map = [ OrganizationName: 'SampleTest', Address: [ Street: '123 Sample St', PostalCode: '00000', ] ] 有没有办法归还所有的钥匙组织名称,组织URL,地址.街道,地址.邮政编码?如果映射中没有映射,我可以使用map.keySet()作为字符串[]。我是否应该循环遍历每个键,看看它是否

我试图确定使用groovy返回嵌套键值的最佳方法。如果我有地图:

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='