Преобразование массива хэшей в массив

#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 by flatten , рассмотрите возможность использования 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. Отличное объяснение, спасибо за разъяснение.