Ruby on Rails — получить массив значений из массива хеша с определенным порядком существующих ключей

Исходный массив выглядит так:

[{:age=>28, :name=>"John", :id=>1}, {:name=>"David", :age=>20, :id=>2, :sex=>"male"}]

Порядок существующих ключей:

[:id, :name, :age] or ['id', 'name', 'age']

Результат должен быть:

[[1, "John", 28], [2, "David", 20]]

Спасибо, что научил меня.

P/s: я использую Ruby 1.8.7 и Rails 2.3.5.

Спасибо


person Anh    schedule 10.02.2015    source источник
comment
Ruby 1.8.7 мертв. Вы не должны использовать его для нового кода.   -  person meagar    schedule 10.02.2015
comment
к сожалению, проект его использует. у меня нет возможности изменить   -  person Anh    schedule 10.02.2015


Ответы (2)


Сопоставьте все записи, а затем сопоставьте атрибуты в указанном порядке, чтобы вернуть значения атрибутов в указанном порядке.

records = [
  {:age=>28, :name=>"John", :id=>1},
  {:name=>"David", :age=>20, :id=>2, :sex=>"male"}
]

attributes = [:id, :name, :age]
records.map do |record|
  attributes.map { |attr| record[attr] }
end
person Ryan Bigg    schedule 10.02.2015
comment
У нас есть прямой метод --- ruby-doc. org/core-2.1.5/Hash.html#method-i-values_at :) и в 1.8.7 тоже ruby-doc.org/core-1.8.7/Hash.html#method-i-values_at - person Arup Rakshit; 10.02.2015

Вот хороший способ использования #values_at :

records = [
  {:age=>28, :name=>"John", :id=>1},
  {:name=>"David", :age=>20, :id=>2, :sex=>"male"}
]

attributes = [:id, :name, :age]

records.collect { |h| h.values_at(*attributes) }
# => [[1, "John", 28], [2, "David", 20]]
person Arup Rakshit    schedule 10.02.2015
comment
Спасибо. Просто любопытство, какое лучшее выступление у Арупа и Райана? - person Anh; 10.02.2015
comment
Приятно :) Я всегда забываю о таких маленьких удобных помощниках. Я думаю, что ответ @Arup, вероятно, более эффективен, поскольку он выполняет итерацию в C (поскольку именно так определяется values_at). Мой ответ делает это в Ruby. Вероятно, крошечная крошечная разница. - person Ryan Bigg; 10.02.2015
comment
@RyanBigg Ты написал книгу? R4IA... Вау! - person Arup Rakshit; 10.02.2015
comment
Да, это я :) С этим новым изданием мне очень помогли Стив Клабник и Ребекка Скиннер. - person Ryan Bigg; 11.02.2015
comment
@RyanBigg Есть ли шанс помочь с этой проблемой? - person Arup Rakshit; 11.02.2015
comment
@RyanBigg У меня такая же проблема, как и в этом вопросе condition-max/" title="ruby, как получить сумму в группе массивов по нескольким ключам с условием max"> stackoverflow.com/questions/28469348/ Не могли бы вы взглянуть? - person Anh; 12.02.2015
comment
@Anh Если у тебя проблемы... почему ты согласился? Вы можете попросить людей, которые уже пытались вам помочь. - person Arup Rakshit; 12.02.2015
comment
@RyanBigg Я принимаю, прежде чем осознаю другую проблему в ответе мистера Кэри. Он ответит позже. Как срочный случай, так я вас беспокою. Извините, если вы сейчас заняты. - person Anh; 12.02.2015