[英]Puppet: Deep merge of an array into a Hash
我在人偶中有一個嵌套數組
$rules = [ [service1, rule1], [service1, rule2], [service2, rule3], [service3, rule4] ]
我需要將其轉換為以下 hash
$rules_hash = {
'service1' => ['rule1', 'rule2'],
'service2' => ['rule3'],
'service3' => ['rule4'],
}
我嘗試使用內置的Hash()
function 但它不是一個選項,因為當有重復的鍵時它只返回該鍵的最后一個實例,給我留下一個不完整的 hash 每個鍵只有一個值。
我還嘗試使用reduce()
迭代數組並為具有公共鍵的值創建字符串"rule1 rule2"
,但是使用reduce()
嵌套數組變得扁平並且無法區分鍵和值我想創建的 hash 沒有特別聲明數組的哪個元素應該是鍵(如果數組有很多不同的鍵,這就變得不可行)。
有多種方法可以做到這一點,但這個非常干凈。 它首先使用內置的group_by
function 來完成繁重的工作:這從一個數組到一個 hash,其中的鍵是你想要的,但值是原始 arrays 的 arrays。例如,給出。 ..
$rules = [ [service1, rule1], [service1, rule2], [service2, rule3], [service3, rule4] ]
... 這個...
$rules.group_by |$rule| { $rule[0] }
...按每個成員 arrays 的第一個元素分組以產生此 hash:
{
service1 => [[service1, rule1], [service1, rule2]],
service2 => [[service2, rule3]],
service3 => [[service3, rule4]]
}
. 你會認識到那與你所追求的有關,但並不完全如此。 然而,結果 hash 中的值非常適合通過應用map()
function 轉換為想要的值:
[[service1, rule1], [service1, rule2]].map |$sr| { $sr[1] }
# yields [ rule1, rule2 ]
通過使用reduce()
function 結合 Puppet 的內置哈希合並運算符 ( +
),可以在每個元素的基礎上將其應用於中間值 hash。 總的來說,這可能看起來像這樣:
$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] } }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.