Puppet:合并具有相同键的散列
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]]
解法:
如果使用 +
,代码的右侧将转换为一个数组,与之前的内容保持一致。使用 <<
此转换未完成。
$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 = [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]]
解法:
如果使用 +
,代码的右侧将转换为一个数组,与之前的内容保持一致。使用 <<
此转换未完成。
$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()
,因为这些函数在构建时保持临时可变状态结果。