我在木偶中有一个嵌套数组
$rules = [ [service1, rule1], [service1, rule2], [service2, rule3], [service3, rule4] ]
我需要将其转换为以下哈希
$rules_hash = {
'service1' => ['rule1', 'rule2'],
'service2' => ['rule3'],
'service3' => ['rule4'],
}
我尝试使用内置的Hash()
函数,但它不是一个选项,因为当有重复的键时,它只返回该键的最后一个实例,给我留下的是每个键只有一个值的不完整哈希。
我还尝试使用CCD_ 2来迭代数组并为具有公共键的值创建字符串CCD_,然而,使用reduce()
,嵌套数组会变平,如果不具体声明数组中的哪个元素应该是键,就无法区分我想要创建的哈希的键和值(如果数组有很多不同的键,这将变得不可行(。
有多种方法可以做到这一点,但这一种非常干净。它首先使用内置的group_by
函数来完成繁重的工作:这从一个数组变成一个散列,其中键是你想要的,但值是原始数组的数组。例如,给定。。。
$rules = [ [service1, rule1], [service1, rule2], [service2, rule3], [service3, rule4] ]
。。。这
$rules.group_by |$rule| { $rule[0] }
按每个成员数组的第一个元素分组以产生此哈希:
{
service1 => [[service1, rule1], [service1, rule2]],
service2 => [[service2, rule3]],
service3 => [[service3, rule4]]
}
你会意识到这与你所追求的有关,但并不完全是这样。然而,生成的散列中的值非常适合通过应用map()
函数转换为所需的值:
[[service1, rule1], [service1, rule2]].map |$sr| { $sr[1] }
# yields [ rule1, rule2 ]
这可以通过结合Puppet的内置哈希合并运算符(+
(使用reduce()
函数,在每个元素的基础上应用于中间哈希。总的来说,这可能看起来像这样:
$rules = [ [service1, rule1], [service1, rule2], [service2, rule3], [service3, rule4] ]
$rules_hash = $rules.group_by |$rule| { $rule[0] } .reduce({}) |$memo, $entry| {
$memo + { $entry[0] => $entry[1].map |$rule| { $rule[1] } }
}