我有一个哈希数组:
a = [{"ID"=>"FOO", "Type"=>"Name"}, {"ID"=>"1234", "Type"=>"CID"}]
我正在尝试提取Type=='CID'
处的哈希,然后将这两个值合并以得出CID=1234
。
我可以分多个步骤进行操作
h = a.find{|x| x['Type']=='CID'}
# => {"ID"=>"1234", "Type"=>"CID"}
"#{h['Type']}=#{h['ID']}"
# => "CID=1234"
有没有办法在一个衬里上做到这一点?
答案 0 :(得分:4)
a.find { |h| h["Type"] == "CID" }&.values_at("Type", "ID")&.join("=")
#=>"CID=1234"
a.find { |h| h["Type"] == "cat" }&.values_at("Type", "ID")&.join("=")
#=> nil
&
是Ruby的safe navigation operator,它在Ruby v2.3中首次亮相。我添加了它,以使nil
上没有匹配项时返回h["Type"]
。
答案 1 :(得分:2)
您可以使用以下命令在一行中完成该操作:
a.select{|x| x['Type']=='CID'}
.map{|x| "type=#{x['Type']},id=#{x['ID']}"}[0]
答案 2 :(得分:1)
您可以尝试以下方法:
如果我们没有Type =“ CID”的多个值:
a.select{|x| x["Type"] == "CID"}.map{|x| x.values_at("Type", "ID")}.join("=")
如果我们有Type =“ CID”
a.detect{|x| x["Type"]=="CID"}.values_at("Type", "ID").join("=")
如果上面的数组中没有Type =“ CID”,则会抛出错误,请谨慎。
在所有情况下都需要工作:
a.detect{|x| x["Type"]=="CID"}.values_at("Type", "ID").join("=") if a.detect{|x| x["Type"]=="CID"}