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(),因为这些函数在构建时保持临时可变状态结果。