首页 文章

如何查找包含匹配值的哈希键

提问于
浏览
179

鉴于我有以下 clients 哈希,是否有一种快速的ruby方式(无需编写多行脚本)来获取密钥,因为我想匹配client_id?例如 . 如何获取 client_id == "2180" 的密钥?

clients = {
  "yellow"=>{"client_id"=>"2178"}, 
  "orange"=>{"client_id"=>"2180"}, 
  "red"=>{"client_id"=>"2179"}, 
  "blue"=>{"client_id"=>"2181"}
}

10 回答

  • 1

    你可以使用hashname.key(valuename)

    或者,可以按顺序进行反演 . new_hash = hashname.invert 会给你一个 new_hash ,它可以让你更传统地做事 .

  • 0

    试试这个:

    clients.find{|key,value| value["client_id"] == "2178"}.first
    
  • 46

    根据ruby doc http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-key key(value)是在值的基础上找到键的方法 .

    ROLE = {"customer" => 1, "designer" => 2, "admin" => 100}
    ROLE.key(2)
    

    它将归还“设计师” .

  • 21

    你可以使用Enumerable#select

    clients.select{|key, hash| hash["client_id"] == "2180" }
    #=> [["orange", {"client_id"=>"2180"}]]
    

    请注意,结果将是所有匹配值的数组,其中每个值都是键和值的数组 .

  • 1

    Ruby 1.9 及更高:

    hash.key(value) => key
    

    Ruby 1.8

    你可以用hash.index

    hsh.index(value)=> key返回给定值的键 . 如果未找到,则返回nil . h = {“a”=> 100,“b”=> 200} h.index(200)#=>“b”h.index(999)#=> nil

    所以要获得 "orange" ,你可以使用:

    clients.key({"client_id" => "2180"})
    
  • 11

    您可以反转哈希值 . clients.invert["client_id"=>"2180"] 返回 "orange"

  • 12

    来自文档:

    • (对象?)检测(ifnone = nil){| obj | ...}

    • (对象?)find(ifnone = nil){| obj | ...}

    • (对象)检测(ifnone = nil)

    • (对象)查找(ifnone = nil)

    传递枚举中的每个条目以阻止 . 返回第一个块不为false的块 . 如果没有对象匹配,则调用ifnone并在指定时返回其结果,否则返回nil .

    如果没有给出块,则返回枚举器 .

    (1..10).detect  {|i| i % 5 == 0 and i % 7 == 0 }   #=> nil
    (1..100).detect {|i| i % 5 == 0 and i % 7 == 0 }   #=> 35
    

    这对我有用:

    clients.detect{|client| client.last['client_id'] == '2180' } #=> ["orange", {"client_id"=>"2180"}] 
    
    clients.detect{|client| client.last['client_id'] == '999999' } #=> nil
    

    见:http://rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method

  • 378

    找到特定值的键的最佳方法是使用可用于哈希的键方法....

    gender = {"MALE" => 1, "FEMALE" => 2}
    gender.key(1) #=> MALE
    

    我希望它能解决你的问题......

  • 5

    我会尝试的另一种方法是使用 #map

    clients.map{ |key, _| key if clients[key] == {"client_id"=>"2180"} }.compact 
    #=> ["orange"]
    

    这将返回给定值的所有出现 . 下划线意味着我们不会携带't need key'的值,以便它匹配 - 这就是为什么我把 #compact 放在最后 .

  • 161

    下面是一个简单的方法来找到给定值的键:

    clients = {
          "yellow"=>{"client_id"=>"2178"}, 
          "orange"=>{"client_id"=>"2180"}, 
          "red"=>{"client_id"=>"2179"}, 
          "blue"=>{"client_id"=>"2181"}
        }
    
        p clients.rassoc("client_id"=>"2180")
    

    ...并找到给定密钥的值:

    p clients.assoc("orange")
    

    它会给你一个键值对 .

相关问题