[英]Puppet: Merge a Hash with same keys
我有一個數組
$servers = [192.168.1.1, 192.168.1.2]
應該將其轉換為具有以下形式的哈希值的數組(具有哈希值的數組,並作為鍵“主機名”和數組服務器的實際值):
[
{ hostname => 192.168.1.1 }
{ hostname => 192.168.1.2 }
]
我嘗試了以下方法:
$servers_hash = $servers.reduce({}) |$servermerge, $serverip| {
$servermerge + { 'hostname' => $serverip }
}
問題是,如果兩個具有相同鍵的哈希與+
合並,第一個會被覆蓋。 所以只剩下{ hostname => 192.168.1.2 }
了。
更新:以及以下內容:
$servers_array = $servers.reduce([]) |$servermerge, $serverip| {
$servermerge + { 'hostname' => $serverip }
}
其中給出: [[hostname, 192.168.1.1], [hostname, 192.168.1.2]]
由於您想要與輸入中的條目一樣多的結果,最簡單(也是最好)的方法是使用map()
函數:
$servers_array = $servers.map |$ip| { { 'hostname' => $ip } }
雖然產生新值的迭代的一般形式是reduce()
但它稍微復雜一些,因為您必須構造結果數組。 在 puppet 中執行此操作時,每個附加<<
運算符都會創建數組的新副本。 如果輸入數組很長,這可能會成為一個很大的開銷。 因此,在可能的情況下,更專業的map()
、 filter()
等迭代函數應該比reduce()
更受歡迎,因為這些函數在構建結果時保持臨時可變狀態。
解決方案:
如果使用+
,則代碼的右側將轉換為數組,與之前相同。 使用<<
這個轉換沒有完成。
$servers_array = $servers.reduce([]) |$servermerge, $serverip| {
$servermerge << { 'hostname' => $serverip }
}
其中給出: [{hostname, 192.168.1.1}, {hostname, 192.168.1.2}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.