Groovy 如何查找具有嵌套子映射的子映射列表

Groovy 如何查找具有嵌套子映射的子映射列表,groovy,Groovy,我有一个列表的映射和嵌套的映射以及以下内容:- def list = [ [ "description": "The issue is open and ready for the assignee to start work on it.", "id": "1", "name": "Open", "statusCategory": [

我有一个
列表
映射
和嵌套的
映射
以及以下内容:-

def list = [
            [
                "description": "The issue is open and ready for the assignee to start work on it.",
                "id": "1",
                "name": "Open",
                "statusCategory": [
                    "colorName": "blue-gray",
                    "id": 2,
                    "key": "new",
                    "name": "To Do",
                ]
            ],
            [
                "description": "This issue is being actively worked on at the moment by the assignee.",
                "id": "3",
                "name": "In Progress",
                "statusCategory": [
                    "colorName": "yellow",
                    "id": 4,
                    "key": "indeterminate",
                    "name": "In Progress",
                ]
            ]
        ]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory"])}
}

println getSubMap(list)
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "colorName":"blue-gray", 
        "id":2, 
        "key":"new", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "colorName":"yellow", 
       "id":"4", 
       "key":"indeterminate", 
       "name":"In Progress"
   ]
  ]
]
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "id":"2", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "id":"4", 
       "name":"In Progress"
   ]
  ]
]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory":["id","name"]])}
}

def modifiedList = getSubMap(list)
def getSubMap = { lst ->
        lst.findResults { it.subMap(["id", "name", "statusCategory"]).statusCategory.subMap(["id","name"])}
}

println getSubMap(list)
我有一个任务,要用嵌套的
subMap
获取
subMap
列表。我正在做的事情如下:-

def list = [
            [
                "description": "The issue is open and ready for the assignee to start work on it.",
                "id": "1",
                "name": "Open",
                "statusCategory": [
                    "colorName": "blue-gray",
                    "id": 2,
                    "key": "new",
                    "name": "To Do",
                ]
            ],
            [
                "description": "This issue is being actively worked on at the moment by the assignee.",
                "id": "3",
                "name": "In Progress",
                "statusCategory": [
                    "colorName": "yellow",
                    "id": 4,
                    "key": "indeterminate",
                    "name": "In Progress",
                ]
            ]
        ]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory"])}
}

println getSubMap(list)
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "colorName":"blue-gray", 
        "id":2, 
        "key":"new", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "colorName":"yellow", 
       "id":"4", 
       "key":"indeterminate", 
       "name":"In Progress"
   ]
  ]
]
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "id":"2", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "id":"4", 
       "name":"In Progress"
   ]
  ]
]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory":["id","name"]])}
}

def modifiedList = getSubMap(list)
def getSubMap = { lst ->
        lst.findResults { it.subMap(["id", "name", "statusCategory"]).statusCategory.subMap(["id","name"])}
}

println getSubMap(list)
但它的输出如下所示:-

def list = [
            [
                "description": "The issue is open and ready for the assignee to start work on it.",
                "id": "1",
                "name": "Open",
                "statusCategory": [
                    "colorName": "blue-gray",
                    "id": 2,
                    "key": "new",
                    "name": "To Do",
                ]
            ],
            [
                "description": "This issue is being actively worked on at the moment by the assignee.",
                "id": "3",
                "name": "In Progress",
                "statusCategory": [
                    "colorName": "yellow",
                    "id": 4,
                    "key": "indeterminate",
                    "name": "In Progress",
                ]
            ]
        ]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory"])}
}

println getSubMap(list)
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "colorName":"blue-gray", 
        "id":2, 
        "key":"new", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "colorName":"yellow", 
       "id":"4", 
       "key":"indeterminate", 
       "name":"In Progress"
   ]
  ]
]
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "id":"2", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "id":"4", 
       "name":"In Progress"
   ]
  ]
]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory":["id","name"]])}
}

def modifiedList = getSubMap(list)
def getSubMap = { lst ->
        lst.findResults { it.subMap(["id", "name", "statusCategory"]).statusCategory.subMap(["id","name"])}
}

println getSubMap(list)
如您所见,我无法获取
statusCategory
key
Map
subMap
。实际上,我想进一步得到嵌套
贴图的
子贴图
,如下所示:-

def list = [
            [
                "description": "The issue is open and ready for the assignee to start work on it.",
                "id": "1",
                "name": "Open",
                "statusCategory": [
                    "colorName": "blue-gray",
                    "id": 2,
                    "key": "new",
                    "name": "To Do",
                ]
            ],
            [
                "description": "This issue is being actively worked on at the moment by the assignee.",
                "id": "3",
                "name": "In Progress",
                "statusCategory": [
                    "colorName": "yellow",
                    "id": 4,
                    "key": "indeterminate",
                    "name": "In Progress",
                ]
            ]
        ]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory"])}
}

println getSubMap(list)
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "colorName":"blue-gray", 
        "id":2, 
        "key":"new", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "colorName":"yellow", 
       "id":"4", 
       "key":"indeterminate", 
       "name":"In Progress"
   ]
  ]
]
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "id":"2", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "id":"4", 
       "name":"In Progress"
   ]
  ]
]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory":["id","name"]])}
}

def modifiedList = getSubMap(list)
def getSubMap = { lst ->
        lst.findResults { it.subMap(["id", "name", "statusCategory"]).statusCategory.subMap(["id","name"])}
}

println getSubMap(list)
为了实现这一点,我尝试如下:-

def list = [
            [
                "description": "The issue is open and ready for the assignee to start work on it.",
                "id": "1",
                "name": "Open",
                "statusCategory": [
                    "colorName": "blue-gray",
                    "id": 2,
                    "key": "new",
                    "name": "To Do",
                ]
            ],
            [
                "description": "This issue is being actively worked on at the moment by the assignee.",
                "id": "3",
                "name": "In Progress",
                "statusCategory": [
                    "colorName": "yellow",
                    "id": 4,
                    "key": "indeterminate",
                    "name": "In Progress",
                ]
            ]
        ]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory"])}
}

println getSubMap(list)
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "colorName":"blue-gray", 
        "id":2, 
        "key":"new", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "colorName":"yellow", 
       "id":"4", 
       "key":"indeterminate", 
       "name":"In Progress"
   ]
  ]
]
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "id":"2", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "id":"4", 
       "name":"In Progress"
   ]
  ]
]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory":["id","name"]])}
}

def modifiedList = getSubMap(list)
def getSubMap = { lst ->
        lst.findResults { it.subMap(["id", "name", "statusCategory"]).statusCategory.subMap(["id","name"])}
}

println getSubMap(list)
但它却让我陷入了困境。如果我正在做以下工作:-

def list = [
            [
                "description": "The issue is open and ready for the assignee to start work on it.",
                "id": "1",
                "name": "Open",
                "statusCategory": [
                    "colorName": "blue-gray",
                    "id": 2,
                    "key": "new",
                    "name": "To Do",
                ]
            ],
            [
                "description": "This issue is being actively worked on at the moment by the assignee.",
                "id": "3",
                "name": "In Progress",
                "statusCategory": [
                    "colorName": "yellow",
                    "id": 4,
                    "key": "indeterminate",
                    "name": "In Progress",
                ]
            ]
        ]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory"])}
}

println getSubMap(list)
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "colorName":"blue-gray", 
        "id":2, 
        "key":"new", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "colorName":"yellow", 
       "id":"4", 
       "key":"indeterminate", 
       "name":"In Progress"
   ]
  ]
]
[
  [
    "id":1, 
    "name":"Open", 
    "statusCategory":[
        "id":"2", 
        "name":"To Do"
    ]
  ], 
  [
    "id":"3", 
    "name":"In Progress", 
    "statusCategory":[
       "id":"4", 
       "name":"In Progress"
   ]
  ]
]
def getSubMap = { lst ->
            lst.findResults { it.subMap(["id", "name", "statusCategory":["id","name"]])}
}

def modifiedList = getSubMap(list)
def getSubMap = { lst ->
        lst.findResults { it.subMap(["id", "name", "statusCategory"]).statusCategory.subMap(["id","name"])}
}

println getSubMap(list)
它只提供嵌套的
子映射作为:-

 [["id":"2", "name":"To Do"], ["id":"4", "name":"In Progress"]]

<是否有人建议我如何递归地查找<代码>列表> <代码>子图嵌套<代码>子映射< /代码>如果存在?

< p>给定原始<代码>列表< /> >,考虑如下:

def resultList = list.collect { 
    def fields = ["id", "name"]
    def m = it.subMap(fields)
    m["statusCategory"] = it["statusCategory"].subMap(fields)
    return m
}
它支持以下断言:

assert 1 == resultList[0]["id"] as int
assert "Open" == resultList[0]["name"]
assert 2 == resultList[0]["statusCategory"]["id"] as int
assert "To Do" == resultList[0]["statusCategory"]["name"]

assert 3 == resultList[1]["id"] as int
assert "In Progress" == resultList[1]["name"]
assert 4 == resultList[1]["statusCategory"]["id"] as int
assert "In Progress" == resultList[1]["statusCategory"]["name"]

给定原始<代码>列表>代码>,考虑如下:

def resultList = list.collect { 
    def fields = ["id", "name"]
    def m = it.subMap(fields)
    m["statusCategory"] = it["statusCategory"].subMap(fields)
    return m
}
它支持以下断言:

assert 1 == resultList[0]["id"] as int
assert "Open" == resultList[0]["name"]
assert 2 == resultList[0]["statusCategory"]["id"] as int
assert "To Do" == resultList[0]["statusCategory"]["name"]

assert 3 == resultList[1]["id"] as int
assert "In Progress" == resultList[1]["name"]
assert 4 == resultList[1]["statusCategory"]["id"] as int
assert "In Progress" == resultList[1]["statusCategory"]["name"]

如果您的代码> map < /COD>嵌套是任意的,那么您可能需要考虑这样的事情:

def nestedSubMap
nestedSubMap = { Map map, List keys ->
    map.subMap(keys) + map.findAll { k, v -> v instanceof Map }.collectEntries { k, v -> [(k):nestedSubMap(v, keys)] }
}
根据您的输入和此闭包,以下脚本:

def result = list.collect { nestedSubMap(it, ["id", "name"]) }
println '['
result.each { print it; println ',' }
println ']'
生成此输出:

[
[id:1, name:Open, statusCategory:[id:2, name:To Do]],
[id:3, name:In Progress, statusCategory:[id:4, name:In Progress]],
]

如果您的代码> map < /COD>嵌套是任意的,那么您可能需要考虑这样的事情:

def nestedSubMap
nestedSubMap = { Map map, List keys ->
    map.subMap(keys) + map.findAll { k, v -> v instanceof Map }.collectEntries { k, v -> [(k):nestedSubMap(v, keys)] }
}
根据您的输入和此闭包,以下脚本:

def result = list.collect { nestedSubMap(it, ["id", "name"]) }
println '['
result.each { print it; println ',' }
println ']'
生成此输出:

[
[id:1, name:Open, statusCategory:[id:2, name:To Do]],
[id:3, name:In Progress, statusCategory:[id:4, name:In Progress]],
]

您的回答很有帮助,但对于map和嵌套map,key并不总是常量,谢谢:)实际上我的解决方案并没有那么有限。它适用于任何一组子映射键,但期望指定的任何键对所有嵌套映射都有效。我将更正文本以澄清。您的回答很有帮助,但对于映射和嵌套映射,键并不总是恒定的,谢谢:)实际上我的解决方案没有那么有限。它适用于任何一组子映射键,但期望指定的任何键对所有嵌套映射都有效。我将更正文本以澄清。