确定哈希表中是否包含来自一组键的任何键?

25

你知道一个优美的 Ruby 方法来查找哈希表中是否存在特定的键吗?

h = {:a => 1, :c => 3, :d => 4}
# keys to find are :a, :b or :e

我知道我可以做一个:

h.key?(:a) || h.key?(:b) || h.key?(:e)

但我想知道是否有更好看的方法来做这件事!:)

非常感谢!


1
看看这个不使用任何循环的绝妙答案:https://dev59.com/Gm445IYBdhLWcg3wq8Pp#4743729 - Pratik Khadloya
4个回答

43
考虑 Enumerable.any?
[:a, :b, :e].any? {|k| h.key?(k)}

来自IRB:

>> h = {:a => 1}; [:x].any? {|k| h.key?(k)}                    
=> false                                                                
>> h = {:a => 1}; [:x, :a].any? {|k| h.key?(k)}                
=> true

编程愉快。


2
当然,如果您想查看它是否具有指定的所有键,则可以使用.all? - Mike Campbell
喜欢这段代码 - 谢谢! - Dom

13

以下是如何从数组中获取所有匹配的键:

> {:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]
 => [:a, :d] 

如果你想要一个布尔值(遵循Andrew的建议):

> ({:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]).empty?
 => false 
> ({:a => 1, :c => 3, :d => 4}.keys & [:f, :e]).empty?
 => true 

+1 用集合交集的方式提供了一个不错的“替代”解决方案。我想补充一点,结果的长度大于0意味着至少存在一个键。 - user166390
2
@pst:如果你只想要一个布尔值,你可以使用.empty? - Andrew Grimm
或者使用 .any? 检查相反的情况。 - famousgarkin
.keys将符号键转换为字符串,因此应该像这样检查 - {:a => 1, :c => 3, :d => 4}.keys&['a','d','e']。 - poorva

3
我会这样做:
[:a, :b, :e].any?{ |val| h.key?(val) } 

1
h.select{|k| [:b, :w, :e].include?(k) }.empty?
h.select{|k| [:a, :w, :e].include?(k) }.empty?

你将会得到匹配键的哈希值(键和值),而且不会是空的吗?


3
对于一个不同的答案,给出+1。然而,这会将操作转换为O(k*n),其中k是哈希中键的数量,n是要尝试查找的具有键序列的长度。 - user166390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接