簡體   English   中英

Ruby數組以日期為鍵進行哈希

[英]Ruby array to hash with dates as keys

我有一個看起來像這樣的數組:

[
  ["20180630", "14:49", "google", "iOS", "Safari", "1"], 
  ["20180630", "12:22", "google", "Android", "Chrome", "2"],
  ["20180629", "17:20", "google", "iOS", "Safari", "1"], 
  ["20180629", "16:30", "(direct)", "iOS", "Safari", "1"], 
  ["20180629", "09:29", "(direct)", "Android", "Chrome", "2"]
]

我想要作為輸出的是哈希,其中日期用作鍵:

{
  "20180630": [["14:49", "google", "iOS", "Safari", "1"],["12:22", "google", "Android", "Chrome", "2"]],
  "20180629": [[...],[...],[...]]
}

Enumerable#group_by將為您提供數組的哈希轉換,然后只需從結果值中刪除冗余列即可:

hash = input_array.group_by(&:first)
hash.each { |_, list| list.each(&:shift) }
hash

(請注意,這會修改原始數組;如果有問題,您需要將其調整為復制量更大且變異較少的版本)

這是兩種構建所需哈希的方法。 都不會改變給定的數組( arr )。

arr = [
  ["20180630", "14:49", "google", "iOS", "Safari", "1"], 
  ["20180630", "12:22", "google", "Android", "Chrome", "2"],
  ["20180629", "17:20", "google", "iOS", "Safari", "1"], 
  ["20180629", "16:30", "(direct)", "iOS", "Safari", "1"], 
  ["20180629", "09:29", "(direct)", "Android", "Chrome", "2"]
]

arr.each_with_object({}) { |a,h| (h[a.first] ||= []) << a.drop(1) }
  #=> {"20180630"=>[["14:49", "google", "iOS", "Safari", "1"],
  #                 ["12:22", "google", "Android", "Chrome", "2"]],
  #   "20180629"=>[["17:20", "google", "iOS", "Safari", "1"],
  #                ["16:30", "(direct)", "iOS", "Safari", "1"],
  #                ["09:29", "(direct)", "Android", "Chrome", "2"]]}

以下是一個變體。

arr.each_with_object(Hash.new { |h,k| h[k] = [] }) { |a,h| h[a.first] << a.drop(1) }

或者,可以使用Hash#update的形式(又名merge! ),該形式采用一個塊來確定要合並的兩個哈希中存在的鍵的值。

arr.each_with_object({}) { |a,h| h.update(a.first=>[a.drop(1)]) { |_,o,n| o+n } }

暫無
暫無

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

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