Получить идентификатор из хэша в массиве хэшей - PullRequest
0 голосов
/ 10 мая 2018

У меня есть массив хэшей:

g_list = [
  {:groups => [{:id => 5}]},
  {:groups => [{:id => 6}]}
]

Мне нужно получить массив :id значений из структуры. Я хочу получить [5, 6].

Как я могу перебрать массив хешей и dig элементы внутри?

Я пытался использовать map и dig:

g_list.map{|g| g.dig(:groups, :id)}

но я получаю ошибку TypeError: no implicit conversion of Symbol into Integer. Я также попытался обработать это с помощью цикла each для одного примера групп:

g_list.each do |g|
   groups = g.dig(:groups)
   puts groups[:id]
end

но я все еще получаю ту же ошибку. Я наконец написал это:

arr = g_list.map {|g| g.dig(:groups).map{|i| i[:id]}}.flatten

и он возвращает то, что я ожидал, но мне интересно, смогу ли я написать это лучше.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Далее возвращается список со всеми идентификаторами групп, даже если элемент содержит более одной группы.

g_list = [
  {:groups => [{:id => 5}]},
  {:groups => [{:id => 6}]}
]

arr = g_list.flat_map { |g| g[:groups] }.map { |i| i[:id] }
arr #=> [5, 6]

g_list = [
  {:groups => [{:id => 5}]},
  {:groups => [{:id => 6}, {:id => 7}]}
]

arr = g_list.flat_map { |g| g[:groups] }.map { |i| i[:id] }
arr #=> [5, 6, 7]

Предполагается, что все элементы имеют клавишу :groups.

0 голосов
/ 10 мая 2018

Индексы массива могут быть переданы в качестве аргументов для вашего dig вызова. Вы хотите, чтобы индекс 0 извлекал отдельный элемент из массива.

g_list.map{|g| g.dig(:groups, 0, :id)}
# => [5, 6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...