簡體   English   中英

Ruby-遍歷不規則重復的哈希數組

[英]Ruby - iterate over array of irregularly repeating hashes

哈希輸入示例數組(具有一些規則和不規則的重復模式):

[{ key1 => value1 }, { key2 => value2 }, { key3 => value3 }, 
 { key4 => value4 }, { key3 => value5 }, { key4 => value6 }, 
 { key1 => value7 }, { key2 => value8 }, { key3 => value9 }, 
 { key4 => value10 }, { key3 => value11 }, { key4 =>  value12 }, { key3  => value13 }, { key4 => value14 },
 { key1 => value15 }, { key2 => value16 }, { key3 =>   value17 }, { key4 => value18 } ]

要求是將以上內容轉換為:

 [ [{ key1 => value1 }, { key2 => value2 },
    { key3key4 => value3value4value5value6 } ]
   [ { key1 => value7 }, { key2 => value8 }, 
     { key3key4 =>       value9value10value11value12value13value14 }]
   [ { key1 => value15 }, { key2 => value16 }, { key3key4 =>   value17value18 }] ]

(請注意,例如key3key4和value5value6value7value8等只是鍵和值的串聯)

輸入結構可以是任意數量的重復哈希,其中key3和key4不規則出現,有時只是兩個哈希,有時是3個等等。

我了解array.each和array.map等,並且我認為要實現上述目標可能需要使用計數器或類似的工具,但是到目前為止,我的工作很快陷入了混亂,因此在此處發布了一些有關如何最好地解決問題的建議。解決這個問題。

編輯:更合理一點,key3和key4(及其值)被連接起來,因為它們是模式的每個循環中哈希值重復(不規則地)重復的鍵,並且希望將其折疊為一個key:value對散列輸出中模式的每個“重復”。 值是實際問題中的字符串,將它們串聯時有意義

如果在所有key3key4之后都重復散列,則key1將始終是第一個鍵,因此我們可以在陣列上使用該鍵和slice_before方法將數組拆分為適當的分組:

output = input.slice_before { |hash| hash.has_key?('key1') }

如果分組的條件並非總是以key1開頭,那么可以使用slice_when在發生兩個相鄰的散列(其中第一個包含可連接的鍵,而第二個不包含可連接鍵)時拆分組。

output = input.slice_when do |current_hash, next_hash|
  concatenate_keys.any? { |key| current_hash.has_key?(key) } &&
    concatenate_keys.none? { |key| next_hash.has_key?(key) }
end 

從那里,我們只需要遍歷並將所有key3key4哈希折疊到一個哈希中,就可以使用mapselectreject

concatenate_keys = %w[key3 key4]
contains_concatenate_key = -> hash { concatenate_keys.any? { |key| hash.has_key?(key) } }

output = output.map do |grouping|
  concatenatable_hashes = grouping.select &contains_concatenate_key

  grouping.reject(&contains_concatenate_key) + [
    { concatenate_keys.join => concatenatable_hashes.flat_map(&:values).join }
  ]
end

p output
# => [[{"key1"=>"value1"}, {"key2"=>"value2"}, {"key3key4"=>"value3value4value5value6"}],
#     [{"key1"=>"value7"}, {"key2"=>"value8"}, {"key3key4"=>"value9value10value11value12value13value14"}],
#     [{"key1"=>"value15"}, {"key2"=>"value16"}, {"key3key4"=>"value17value18"}]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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