2015-02-10 74 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

相关问题