Массив Ruby для хеширования с датами в качестве ключей - PullRequest
0 голосов
/ 01 июля 2018

У меня есть массив, который выглядит так:

[
  ["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": [[...],[...],[...]]
}

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вот два способа создать желаемый хеш. Никто не изменяет данный массив (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 } }
0 голосов
/ 01 июля 2018

Enumerable#group_by даст вам преобразование хеш-массивов, тогда достаточно просто удалить лишний столбец из результирующих значений:

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

(обратите внимание, что изменяются исходные массивы; вам нужно настроить версию с большим количеством копий и меньшим количеством мутаций, если это проблема)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...