Вот два способа создать желаемый хеш. Никто не изменяет данный массив (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 (a.k.a merge!
), в которой используется блок для определения значений ключей, присутствующих в обоих объединяемых хэшах.
arr.each_with_object({}) { |a,h| h.update(a.first=>[a.drop(1)]) { |_,o,n| o+n } }