Группировка / фильтрация подмассивов многомерного массива в Ruby / RoR - PullRequest
3 голосов
/ 27 марта 2020

У меня есть запрос Ruby on Rails, заканчивающийся .pluck(:id, :title) и дающий мне массив, полный двумерных массивов, например:

array = [[11145, "string1"], [11223, "string1"], [11205, "string2"], [11127, "string2"], [11080, "string3"], [11158, "string3"]]

Я бы хотел сгруппировать идентификаторы по title для получения этого результата:

 [[[11145, 11223], "string1"], [[11205, 11127], "string2"], [[11080, 11158], "string3"]]

Я пытался объединить идентификаторы непосредственно в запросе SQL или манипулировать массивом, но не управлял ожидаемым результатом.

Любая помощь приветствуется. Заранее спасибо.

1 Ответ

3 голосов
/ 27 марта 2020

Быстрое решение:

array.group_by(&:last).transform_values { |e| e.map(&:first) }.to_a
  1. Enumerable#group_by
  2. Hash#transform_values

Еще один вариант:

array.each_with_object(Hash.new {|h,k| h[k] = [] }) do |obj, res|
  res[obj.last] << obj.first
end.to_a
  1. Hash#default_proc
  2. Enumerable#each_with_object

UPD Я не знаю, как выглядит ваш запрос, но если вы работаете с PG, вы можете попробовать поиграть с таким окончанием:

.group(:title).select('array_agg(id) as ids, title').map { |e| [e.title, e.ids] }

...