2

次のようなネストされたマップがあるとします。

def map = [group: [group_name: 'test', group_color: 'red']]

それをこれに変える方法はありますか:

['group-group_name': 'test', 'group-group_color': 'red']

マップには、任意のレベルのネストを含めることができます。

詳細な説明: マップがツリーと見なされる場合、結果のマップにすべてのリーフ値が値として含まれるようにし、各キーは、ツリーの最上部からリーフ ノード (上記の例では、すべてのキーが を使用して結合されています-)。

これは私が望むものです(もちろん動作しません):

def newMap = map.findAll { it.isLeaf() }.collect { [it.absoluteKeyPath: it.value] }
4

1 に答える 1

3

私はこれがそれを行うべきだと信じています:

def map = [ cheese: 'cheddar', 
            group: [ group_name: 'test',
                     group_color: 'red',
                     deep:[ bool:'yes' ] ] ]

def compress( Map m, String prefix = '' ) {
  prefix = prefix ? "$prefix-" : ''
  m.collectEntries { k, v ->
    if( v instanceof Map ) compress( v, "$prefix$k" )
    else [ ("$prefix$k".toString()): v ]
  }
}

assert compress( map ) == [ 'cheese':'cheddar',
                            'group-group_name':'test',
                            'group-group_color':'red',
                            'group-deep-bool':'yes' ]

もちろん、マップ キーにはすでに-char が含まれている可能性があるため、葉へのパスと同じ名前を付けるとデータが失われる可能性があるため、注意が必要です。

于 2013-04-12T10:33:09.987 に答える