在红宝石中,我有
res = [[0, :product, "client"], [0, :os, "windows"], [0, :architecture, "32rs"]]
我想获得操作系统的价值。我可以通过 res[1][2] 来做到这一点,但我不想依赖索引,因为它可以改变。我所拥有的是关键,即:os,那么找到它的最佳方法是什么?
在红宝石中,我有
res = [[0, :product, "client"], [0, :os, "windows"], [0, :architecture, "32rs"]]
我想获得操作系统的价值。我可以通过 res[1][2] 来做到这一点,但我不想依赖索引,因为它可以改变。我所拥有的是关键,即:os,那么找到它的最佳方法是什么?
假设您无法更改数据的结构方式,您可以执行以下操作:
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"
hash = Hash[res.map{ |a| a[1..-1] }]
hash[:os] # windows
虽然@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" ] ]
并以这种方式解决它。