木偶:使用相同的键合并哈希

问题描述

我有一个数组

$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(),但由于必须构造结果数组,所以它稍微复杂一些。在人偶中执行此操作时,每个带有<<运算符的附加操作都会创建该数组的新副本。如果输入数组很长,那么这可能会成为很大的开销。出于这个原因,在可能的情况下,应优先选择更专业的map()filter()等迭代函数,而不是reduce(),因为这些函数在建立时会保持临时可变状态结果。

,

解决方案:

如果使用+,则代码的右侧将强制转换为数组,从而针刺之前的状态。使用<<时,此转换无法完成。

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

哪个给出:[{hostname,192.168.1.1},{hostname,192.168.1.2}]