【问题标题】:Puppet: Merge a Hash with same keysPuppet:合并具有相同键的哈希
【发布时间】:2020-09-28 13:45:03
【问题描述】:

我有一个数组

$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]]

【问题讨论】:

  • 我不相信大多数语言都允许哈希/映射/字典具有相同的键,而 Puppet 就是其中之一。为此,您可能需要不同的结构。
  • 有道理,但哈希值几乎相同的数组在我看来应该没问题?
  • 如果您将哈希放入数组中 - [ { 'hostname => $serverip}],您的逻辑将适用于 + - 但我在这里发布了您应该做什么的真正答案:stackoverflow.com/a/64149583/327930(使用 @987654331 @函数而不是reduce()

标签: hash merge key puppet


【解决方案1】:

由于您想要与输入中的条目一样多的结果,因此最简单(也是最好)的方法是使用 map() 函数:

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

虽然产生新值的迭代的一般形式是reduce(),但它稍微复杂一些,因为您必须构造结果数组。在 puppet 中这样做时,每个附加 << 运算符都会创建一个新的数组副本。如果输入数组很长,这可能会成为很大的开销。出于这个原因,更专业的 map()filter() 等迭代函数应该优先于 reduce(),因为这些函数在构建结果时会保持临时可变状态。

【讨论】:

    【解决方案2】:

    解决方案:

    如果使用+,则代码的右侧将转换为一个数组,与之前相同。对于 <<,此转换尚未完成。

    $servers_array = $servers.reduce([]) |$servermerge, $serverip| {
      $servermerge << { 'hostname' => $serverip }
    }
    

    其中给出:[{hostname, 192.168.1.1}, {hostname, 192.168.1.2}]

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 2020-11-16
      • 1970-01-01
      • 2019-05-03
      • 2014-09-14
      • 1970-01-01
      • 2013-02-24
      • 2018-06-10
      • 2013-05-04
      相关资源
      最近更新 更多