Hash Puppet:使用相同的键合并哈希

Hash Puppet:使用相同的键合并哈希,hash,merge,key,puppet,Hash,Merge,Key,Puppet,我有一个数组 $servers = [192.168.1.1, 192.168.1.2] 应将其转换为具有以下形式散列的数组(具有散列并作为键“hostname”和数组服务器的实际值的数组): 我尝试了以下方法: $servers_hash = $servers.reduce({}) |$servermerge, $serverip| { $servermerge + { 'hostname' => $serverip } } $servers_array = $servers.

我有一个数组

$servers = [192.168.1.1, 192.168.1.2]
应将其转换为具有以下形式散列的数组(具有散列并作为键“hostname”和数组服务器的实际值的数组):


我尝试了以下方法:

$servers_hash = $servers.reduce({}) |$servermerge, $serverip| {
  $servermerge + { 'hostname' => $serverip }
}
$servers_array = $servers.reduce([]) |$servermerge, $serverip| {
  $servermerge + { 'hostname' => $serverip }
}
问题是,如果具有相同密钥的两个哈希与
+
合并,则第一个哈希将被覆盖。所以只剩下
{hostname=>192.168.1.2}

更新:和以下内容:

$servers_hash = $servers.reduce({}) |$servermerge, $serverip| {
  $servermerge + { 'hostname' => $serverip }
}
$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()
函数:

$servers_array = $servers.map |$ip| { { 'hostname' => $ip } }

虽然生成新值的迭代的一般形式是
reduce()
,但它稍微复杂一些,因为您必须构造生成的数组。在puppet中执行此操作时,每个追加都带有
,我认为大多数语言不允许使用相同键的哈希/映射/字典,puppet就是其中之一。你可能需要一个不同的结构来实现这一点。这是有道理的,但在我看来,具有几乎相同哈希值的数组应该没有问题?如果你将哈希值放在数组中,你的逻辑将与
+
一起工作-
[{'hostname=>$serverip}]
-但我在这里给出了你应该做的真正答案:(使用
映射()
函数而不是
reduce()
我认为大多数语言不允许使用相同键的哈希/映射/字典,Puppet就是其中之一。您可能需要不同的结构来实现这一点。这是有道理的,但在我看来,使用几乎相同哈希的数组应该没有问题?如果您将哈希放入数组-
,您的逻辑将与
+
一起工作{'hostname=>$serverip}]
-但是我在这里发布了您应该做什么的真正答案:(使用
map()
函数而不是
reduce()