#arrays #ruby #hash
#массивы #ruby #хэш
Вопрос:
У меня есть массив хэшей, из которого мне нужны значения хэшей в новом массиве. Массив хэшей выглядит примерно так, их несколько тысяч.
array = [{:code=>"404"}, {:code=>"302"}, {:code=>"200"}]
Я пытался найти это, но узнал только, как конвертировать из хэша.
Как бы я это сделал?
Комментарии:
1. Можете ли вы добавить, каким должен быть результат?
2.
array.flat_map { |h| h.values }
Ответ №1:
[{:code=>"404"}, {:code=>"302"}, {:code=>"200"}].flat_map(amp;:values)
#⇒ ["404", "302", "200"]
Ответ №2:
a=[{:code=>"404"}, {:code=>"302"}, {:code=>"200"}]
puts a.map{|x|x.values}.flatten.inspect
вывод
["404", "302", "200"]
Комментарии:
1. Когда я пытаюсь использовать это, я получаю неопределенный метод для части значений. Есть предложения?
2. Вы использовали тот же код? Поскольку я выполнил свой код и вставил его сюда, он работает нормально. Какую версию Ruby вы используете?
3. Я попробовал это в irb, и у меня это тоже сработало. Должно быть, что-то в моем коде заставляет его не работать. Я использую 2.3.1.
4. Я заставил это работать. это были две скобки с обоих концов, потому что я вставлял массив в другой массив.
5. всякий раз, когда вы используете
map
followed byflatten
, рассмотрите возможность использованияflat_map
вместо.
Ответ №3:
arr =[{:code=>"404"}, {:code=>"302"}, {:code=>"200"}]
arr.map { |h| h[:code] }
#=> ["404", "302", "200"]
или, если имя ключа (сейчас :code
) может измениться в будущем:
arr.map { |h| h.first.last }
#=> ["404", "302", "200"]
Комментарии:
1. Хорошая идея! Я не заметил того факта, что ключи равны. А также я не знаю, что
h.first
преобразует хэш-ключ, значение в массив.2. @Gopal, это всегда так, когда элементы хэша (пары ключ-значение) перечисляются. Например,
{a: 1, b: 2}.each { |a| p a }
выводит[:a, 1]
затем[:b, 2]
.3. Да, но какова связь между перечислением и .first? почему .first возвращает массив ключей, значений?
4. @Gopal,
first
это метод вEnumerable
модуле. Этот модуль включен в классHash
. Все методыEnumerable
требуют, чтобы получатель был перечислителем. Приfirst
вызове хэша Ruby (увидев, что метода нетHash#first
, и зная, что для этогоEnumerable#first
требуется перечислитель) вставляет метод экземпляраHash#each
:{a: 1}.first
оценивается как{a: 1}.each.first
. Вот почему все классы, которые включаютEnumerable
, должны иметь методeach
, который возвращает перечислитель.5. Отличное объяснение, спасибо за разъяснение.