簡體   English   中英

Puppet:將數組深度合並到 Hash

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM