2

在红宝石中,我有

res = [[0, :product, "client"], [0, :os, "windows"], [0, :architecture, "32rs"]]

我想获得操作系统的价值。我可以通过 res[1][2] 来做到这一点,但我不想依赖索引,因为它可以改变。我所拥有的是关键,即:os,那么找到它的最佳方法是什么?

4

3 回答 3

5

假设您无法更改数据的结构方式,您可以执行以下操作:

res.select{|h| h.include?(:os)}.map(&:last)

但在我看来,您的数据最好用哈希表示。

res_hash = res.each_with_object({}) do |value, memo| 
  memo[value[1]] = value[2]
end
# => {:product=>"client", :os=>"windows", :architecture=>"32rs"}

然后您可以像这样访问离散数据属性:

res_hash[:os]
# => "windows"
于 2012-10-12T19:43:16.650 回答
4
hash = Hash[res.map{ |a| a[1..-1] }]
hash[:os] # windows
于 2012-10-12T19:48:49.860 回答
0

虽然@pje 是在您无法更改数据的假设下回答的,但我将详细说明他在哈希中构造数据的建议:

res = [ [0, product: "client"],
        [0, os: "windows"],
        [0, architecture: "32rs"] ]

逗号存在和冒号位置的微小变化会导致 Ruby 编译器将 [] 表达式解析为其最后一个元素的哈希值:

[ [0, {product: "client}], [0, {os: "windows"}], [0, architecture: "32rs"] ]

然后你可以轻松地解决你需要的东西

res[1][1][:os]

如果您担心二级数组的顺序会发生变化,您应该更深入地重构数据,例如:

res = { product: [ 0, "client" ], os: [ 0, "windows" ], architecture: [ 0, "32rs" ] ]

并以这种方式解决它。

于 2012-10-12T19:59:59.550 回答