2015-02-10 73 views
1

原來陣列喜歡這樣的:現有的密鑰的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

感謝

+0

[紅寶石1.8.7是死的(https://www.ruby-lang.org/en/news/2013/06/ 30 /我們退休的-1-8-7 /)。您不應該將它用於新代碼。 – meagar 2015-02-10 03:48:02

+0

不幸的是,該項目使用它。我沒有選擇更改 – Anh 2015-02-10 03:56:43

回答

3

地圖中的所有記錄,然後映射在給定的順序在返回屬性的值的屬性指定的順序。

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 
+0

我們有一個直接的方法--- http://ruby-doc.org/core-2.1.5/Hash.html#method-i-values_at :)並且在1.8.7中也是http: //ruby-doc.org/core-1.8.7/Hash.html#method-i-values_at – 2015-02-10 03:48:18

+0

工作!再次感謝。 – Anh 2015-02-10 03:50:15

4

這裏使用一個很好的方式#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]] 
+0

謝謝。只是好奇心,奧雅納和瑞安的最佳表現如何? – Anh 2015-02-10 03:55:56

+0

不錯:)我總是忘記這樣的小便利幫手。我認爲@Arup的答案可能是更高性能的,因爲它在C中進行迭代(因爲這是'values_at'的定義)。我的答案在Ruby中做到了。可能是一個微小的差異。 – 2015-02-10 06:14:12

+0

@RyanBigg你寫了這本書? R4IA ... WooW! – 2015-02-10 06:15:07

相關問題