Конвертировать массив хэшей в хеш - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь преобразовать следующее:

dep = [
      {id: 1, depen: 2},
      {id: 1, depen: 3},
      {id: 3, depen: 4},
      {id: 5, depen: 3},
      {id: 3, depen: 6}
]

В один хеш:

# {1=>2, 1=>3, 3=>4, 5=3, 3=>6}

Я попытался найти решение по другому вопросу :

dep.each_with_object({}) { |g,h| h[g[:id]] = g[:dep_id] } 

Однако выходные данные удалили элементы и дали мне:

#{1=>3, 3=>6, 5=>2}

, где последний элемент также неверен.

1 Ответ

6 голосов
/ 13 июня 2019

Вы не можете иметь хэш, подобный {1=>2, 1=>3, 3=>4, 5=3, 3=>6}.Все ключи хеша mst должны быть уникальными.

Если вы хотите получить хеш, отображающий каждый идентификатор в список зависимостей, вы можете использовать:

result = dep.
  group_by { |obj| obj[:id] }.
  transform_values { |objs| objs.map { |obj| obj[:depen] } }

Или

result = dep.reduce({}) do |memo, val|
  memo[val[:id]] ||= []
  memo[val[:id]].push val[:depen]
  memo
end

, которые производят

{1=>[2, 3], 3=>[4, 6], 5=>[3]}
...