2016-06-03 3 views
0

Я массив, который представляет часы работы для магазина и хранятся в виде:рельсов 4: Group_by с 2-х переменными

schedule = [ [[mon_open, 9], [mon_close, 5]], 
      [[tues_open, 11], [tues_close, 7]], 
      [[wed_open, 9], [wed_close, 5]], 
      [[thur_open,9], [thur_close, 5]], 
      [[fri_open, 11], [fri_close, 7]] ] 

В этой ситуации я хотел бы группу массивов таким образом, что в приведенном выше пример [[mon_open, 9],[mon_close, 5]], [[wed_open, 9],[wed_close, 5]] и [[thur_open,9],[thur_close, 5]] будут сгруппированы вместе ...

и точно также [[tues_open, 11],[tues_close, 7]] и [[fri_open, 11],[fri_close, 7]] будут сгруппированы вместе.

В принципе, я хочу группировать дни недели с такими же временами открытия и закрытия. Можно ли это сделать просто?

ответ

1

Путем групповой работы вы выбираете, что хотите использовать для ключей, поэтому, например, что-то подобное должно делать то, что вы хотите.

здесь блок просто возвращает массив из последних элементов в каждом из двух элементов массивов, которые вы перечислили (я преобразовал «mon_open», и т.д., чтобы символы, вы можете использовать строки также.

schedule = [ [[:mon_open, 9], [:mon_close, 5]], 
      [[:tues_open, 11], [:tues_close, 7]], 
      [[:wed_open, 9], [:wed_close, 5]], 
      [[:thur_open,9], [:thur_close, 5]], 
      [[:fri_open, 11], [:fri_close, 7]] ] 


grouped = schedule.group_by { |i| [i[0].last, i[1].last]} 
puts grouped 

, что вы получаете это

{[9, 5]=>[[[:mon_open, 9], [:mon_close, 5]], [[:wed_open, 9], [:wed_close, 5]], [[:thur_open, 9], [:thur_close, 5]]], [11, 7]=>[[[:tues_open, 11], [:tues_close, 7]], [[:fri_open, 11], [:fri_close, 7]]]}