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

Cod*_*ama 191 ruby

鉴于我有以下客户端哈希,是否有一个快速的ruby方式(无需编写多行脚本)来获取密钥给定我想匹配client_id?例如,如何获得密钥client_id == "2180"

clients = {
  "yellow"=>{"client_id"=>"2178"}, 
  "orange"=>{"client_id"=>"2180"}, 
  "red"=>{"client_id"=>"2179"}, 
  "blue"=>{"client_id"=>"2181"}
}
Run Code Online (Sandbox Code Playgroud)

Ail*_*lyn 397

Ruby 1.9及更高版本:

hash.key(value) => key
Run Code Online (Sandbox Code Playgroud)

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"})
Run Code Online (Sandbox Code Playgroud)

  • `Hash #index`在Ruby 1.9中被重命名为`Hash#key` (51认同)
  • 请注意,这只返回第一个匹配,如果有多个具有相同值的哈希配对,它将返回具有匹配值的第一个键. (12认同)
  • 如果散列有多个键,这会变得有点混乱,因为你需要将整个散列赋予`index`. (2认同)

Dan*_*uis 170

你可以使用Enumerable #select:

clients.select{|key, hash| hash["client_id"] == "2180" }
#=> [["orange", {"client_id"=>"2180"}]]
Run Code Online (Sandbox Code Playgroud)

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

  • @Coderama`find`和`select`之间的区别在于`find`返回第一个匹配,`select`(由`findAll`别名)返回所有匹配. (22认同)
  • 请注意,从[Ruby 1.9.3](http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-select)开始,这将返回带有匹配项的新哈希.它不会返回一个数组,因为它[曾用于Ruby <= 1.8.7](http://www.ruby-doc.org/core-1.8.7/Hash.html#method-i-select).`clients.select {| key,hash | hash ["client_id"] =="2180"}#=> {"orange"=> {"client_id"=>"2180"}} (3认同)

Pet*_*ese 47

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

  • 这也似乎是一种聪明的方式(因为它很短)! (3认同)

bou*_*uby 22

你可以使用hashname.key(valuename)

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

  • 这是在Ruby的最新版本(1.9+)中执行此操作的正确方法. (3认同)

iNe*_*cas 14

试试这个:

clients.find{|key,value| value["client_id"] == "2178"}.first
Run Code Online (Sandbox Code Playgroud)

  • 如果find返回nil,这将抛出异常,因为你不能在nil上调用.first. (4认同)
  • 在 `Ruby 2.3.0 +` 中你可以使用 [safe navigator](http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/) `&amp;.first` 在末尾阻止零异常 (2认同)

Afz*_*ood 12

根据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)
Run Code Online (Sandbox Code Playgroud)

它将归还"设计师".


Rim*_*ian 6

来自文档:

  • (对象?)检测(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
Run Code Online (Sandbox Code Playgroud)

这对我有用:

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

clients.detect{|client| client.last['client_id'] == '999999' } #=> nil 
Run Code Online (Sandbox Code Playgroud)

请参阅:http: //rubydoc.info/stdlib/core/1.9.2/Enumerable#find-instance_method