将两个哈希键的值合并到一个哈希数组中

时间:2018-09-18 03:20:06

标签: ruby

我有一个哈希数组:

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"

有没有办法在一个衬里上做到这一点?

3 个答案:

答案 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"}