Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在哈希数组中搜索哈希键值_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何在哈希数组中搜索哈希键值

Ruby on rails 如何在哈希数组中搜索哈希键值,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个哈希数组: array = [ {:name => "Bob" , :age => 27 , :place => "A"} , {:name => "John" , :age => 50 , :place => "B"} , {:name => "Alex" , :age => 80 , :place => "C"} ] 我想得到:place if:name==John的值 然而,如果我使用 array.find {|x|

我有一个哈希数组:

array = [
 {:name => "Bob" , :age => 27 , :place => "A"} ,
 {:name => "John" , :age => 50 , :place => "B"} ,
 {:name => "Alex" , :age => 80 , :place => "C"} 
]
我想得到:place if:name==John的值

然而,如果我使用

array.find {|x| x[:name] == "John"}
我明白了

我可以用

array.second[:place]
它将返回B,但数组将有三个以上的散列元素

如何在另一个键的值的条件下获得返回的正确位置?

find在您的情况下返回一个散列,只需传递key:place即可获得值:

hash = array.find {|x| x[:name] == "John"}
return if hash.nil?
hash[:place]
 p array.find {|x| x[:name] == "John"}[:place]
关于混合值的查询,我只是在IRB中尝试过,效果很好

2.7.0 :014 > array = [
2.7.0 :015 >   {:name => "Bob" , :age => 27 , :place => "A"} ,
2.7.0 :016 >   {:name => "John" , :age => 50 , :place => "B"} ,
2.7.0 :017 >   {:name => "Alex" , :age => 80 , :place => "C"} 
2.7.0 :018 > ]
2.7.0 :019 > array.find {|x| x[:name] == "John"}
 => {:name=>"John", :age=>50, :place=>"B"} 

这将返回以下值:

hash = array.find {|x| x[:name] == "John"}
return if hash.nil?
hash[:place]
 p array.find {|x| x[:name] == "John"}[:place]

创建一个方法并将John作为参数传递,以便您也可以获取其他名称的值。

如果需要一个方法调用,它们可能会通过更早的返回欺骗find

array.find{| h | break h[:place]如果h[:name]=“John”} ⇒B
它返回的是一个散列,但返回的是第一个和第二个数组的混合。我刚刚在irb中尝试过,效果很好,更新了我的答案。你还有别的事要做吗?在告诉我你做的和我一直在做的完全一样之后,我注意到我有一个打字错误!谢谢虽然是首选项,但我不会在这里明确检查nil。除非散列足够,否则返回。array.find{x | x[:name]==John}&.[]:place很难看,但可以作为一个一行。当名称不在任何散列中时,它会返回什么?他正在给我们模型散列。您可以编写array.find{h | h[John]}或array.find{h | h[John]&.[place,如果前面的表达式返回nil,则会导致整个表达式返回nil必须后跟句点,因此无法使用语法sugar编写方法Hash[]。或者,如果合适,如果数组中没有哈希值为key:name.John,则引发异常。看起来您在错误的位置进行搜索。散列数组看起来像是您向数据库查询所有记录并试图搜索它们,但您应该通过查询该特定用户的数据库来实现这一点。看。如果你经常这样做,你可能应该创建一个散列,名称作为键,年龄和地点作为值。@Eric,或者更一般地说,一个唯一标识符作为键。@Eric,我在想大约翰·史密斯和小约翰·史密斯,但是Yesally在寻找欺骗的方法。。。我不能说我以前见过!有趣。@CarySwoveland嗯,在任何一个街区都可以使用break和next。是的,但我发现有趣的是,为了避免块后的计算,将break X与块返回nil相结合,以确定条件是否为假。@CarySwoveland我的队友说,接受我的PR的规则是:作弊的数量应该是偶数,以便它们相互抵消。