2017-07-11 10 views
0

入れ子のマップから平坦化されたマップを取得したいと思います。フラット化されたマップには、キーで区切られたキーが必要です。例えばgroovyの入れ子になったマップから1次元のマップを返します

def map = ['environment':'production', 'classes':['nfs-server':['exports':['/srv/share1', '/srv/share3']]], 'parameters':'null'] 

予想される出力は、私は周りを見回したと再帰を使用して、次のコードスニペットを思い付いた

[environment:'production', classes.nfs-server.exports:['/srv/share1', '/srv/share3'], parameters:'null'] 

です。ここでは、コード

def Map<String, String> getNestedMapKeys(Map map, String keyPrefix = '') { 
def result = [:] 
map.each { key, value -> 
    if (value instanceof Map) { 
    result += getNestedMapKeys(value, keyPrefix += "$key.") 
    } else { 
    String finalKey = "$keyPrefix$key" 
    // need to wrap in parenthesis because it's a variable 
    result << [(finalKey): value] 
    } 
} 
result 

}

があり、それを実行しているからの出力は

[environment:'production', classes.nfs-server.exports:['/srv/share1', '/srv/share3'], classes.parameters:'null'] 

だから、ネストされたマップの後に処理されたキーは、まだ接頭辞を保持していますさ。この場合、 'classes.parameters'は単に 'parameters'でなければなりません。それを修正するための助けに感謝します。ありがとう。

答えて

1

メインマップのネストマップの処理の最後に 'keyPrefix'変数をリセットする必要がありました。

def Map<String, String> getNestedMapKeys(Map map, String keyPrefix = '') { 
def result = [:] 
map.each { key, value -> 
    if (value instanceof Map) { 
    print 'key prefix is ' + keyPrefix 
    result += getNestedMapKeys(value, keyPrefix += "$key.") 
    keyPrefix = '' 
    } else { 
    String finalKey = "$keyPrefix$key" 
    // need to wrap in parenthesis because it's a variable 
    result << [(finalKey): value] 
    } 
} 
result 
} 
0

これはどうですか。

def flattenMap(Map map) { 
    map.collectEntries { k, v -> 
     v instanceof Map ? 
      flattenMap(v).collectEntries { k1, v1 -> 
       [ "${k}.${k1}": v1 ] 
      } 
     : 
      [ (k): v ] 
    } 
} 
関連する問題