代码之家  ›  专栏  ›  技术社区  ›  craig

在哈希数组中组合两个哈希键的值

  •  0
  • craig  · 技术社区  · 7 年前

    我有一个哈希数组:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Alex Harvey    7 年前

    您可以在一行中使用:

    a.select{|x| x['Type']=='CID'}
      .map{|x| "type=#{x['Type']},id=#{x['ID']}"}[0]
    
        2
  •  4
  •   Cary Swoveland    7 年前
    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
    

    & 是鲁比的吗 safe navigation operator ,它在Ruby v2.3中首次亮相。我把它加进去是为了 nil 如果上没有匹配项,则返回 h["Type"]

        3
  •  1
  •   tekuri    7 年前

       a.select{|x| x["Type"] == "CID"}.map{|x| x.values_at("Type", "ID")}.join("=")
    

    如果我们有类型=“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"}
    
    推荐文章