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