Puppet:将数组深度合并为哈希



我在木偶中有一个嵌套数组

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

最新更新