Rails - 如何在嵌套哈希

时间:2017-02-16 11:34:02

标签: ruby-on-rails hash

我有一个哈希:

{"1"=>{"asset_class_id"=>"12", "ratio"=>"121"},
"2"=>{"asset_class_id"=>"22", "ratio"=>"45"},
"3"=>{"asset_class_id"=>"32", "ratio"=>"9"},
"4"=>{"asset_class_id"=>"42", "ratio"=>""}}

我想要实现的是获取比率的所有值并排除类似这样的空值:

["121", "45", "9"]

6 个答案:

答案 0 :(得分:2)

hash = {"1"=>{"asset_class_id"=>"12", "ratio"=>"121"},
     "2"=>{"asset_class_id"=>"22", "ratio"=>"45"},
     "3"=>{"asset_class_id"=>"32", "ratio"=>"9"},
     "4"=>{"asset_class_id"=>"42", "ratio"=>""}}



hash.values.map{|x| x['ratio']}.reject!(&:empty?)

答案 1 :(得分:0)

> hsh = {"1"=>{"asset_class_id"=>"12", "ratio"=>"121"},
 "2"=>{"asset_class_id"=>"22", "ratio"=>"45"},
 "3"=>{"asset_class_id"=>"32", "ratio"=>"9"},
 "4"=>{"asset_class_id"=>"42", "ratio"=>""}}

> hsh.values
=> [{"asset_class_id"=>"12", "ratio"=>"121"}, 
    {"asset_class_id"=>"22", "ratio"=>"45"}, 
    {"asset_class_id"=>"32", "ratio"=>"9"}, 
    {"asset_class_id"=>"42", "ratio"=>""}]

> hsh.values.map{|h| h["ratio"]}
=> ["121", "45", "9", ""]

> hsh.values.map{|h| h["ratio"]}.reject{|v| v.empty? }
=> ["121", "45", "9"]

答案 2 :(得分:0)

下面的代码会有技巧,但是这个({a,b,c})不是有效的ruby语法。

> newarr=[] 
> a.values.each {|x| newarr << x['ratio']}
 => [{"asset_class_id"=>"12", "ratio"=>"121"}, {"asset_class_id"=>"22", "ratio"=>"45"}, {"asset_class_id"=>"32", "ratio"=>"9"}, {"asset_class_id"=>"42", "ratio"=>""}] 
> newarr
 => ["121", "45", "9", ""] 

<强>更新

inf第一版问题,还包括空字符串。跳过它,你应该这样做,

a.values.each {|x| newarr << x['ratio'] unless x['ratio'].blank? }

或,

a.values.each {|x| newarr << x['ratio'] if x['ratio'].present? }

但请注意,以上两行仅为轨道解决方案。

下面是普通的红宝石。

a.values.each {|x| newarr << x['ratio'] unless x['ratio'].empty? }

答案 3 :(得分:0)

使用此代码:

arr = []
a.values.each {|e| arr << e["ratio"] if e["ratio"].present?}
puts arr

答案 4 :(得分:0)

hash = {"1"=>{"asset_class_id"=>"12", "ratio"=>"121"},
 "2"=>{"asset_class_id"=>"22", "ratio"=>"45"},
 "3"=>{"asset_class_id"=>"32", "ratio"=>"9"},
 "4"=>{"asset_class_id"=>"42", "ratio"=>""}}

您可以简单地调用该命令

  

哈希[hash.to_a] .values.map {| V | v [:ratio] .if v [:ratio] .present?}

答案 5 :(得分:0)

这不是最好的代码,但你可以从一开始:

x = {"asset_class_id"=>"12", "ratio"=>"121"}
x.each do |key, value|
    if key=="ratio"
    puts value
end
end

嗯,我有点晚了。以上解决方案更好。

相关问题