检查哈希的键是否包含所有一组键

Gre*_*ida 55 ruby

我正在寻找一种更好的方法

if hash.key? :a &&
   hash.key? :b &&
   hash.key? :c &&
   hash.key? :d
Run Code Online (Sandbox Code Playgroud)

最喜欢的东西

hash.includes_keys? [ :a, :b, :c, :d ] 
Run Code Online (Sandbox Code Playgroud)

我想出来了

hash.keys & [:a, :b, :c, :d] == [:a, :b, :c, :d]
Run Code Online (Sandbox Code Playgroud)

但我不喜欢两次添加数组

Mor*_*ori 104

%i[a b c d].all? {|s| hash.key? s}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想让它更复杂,可以使用`[:a,:b,:c,:d] .all?(&hash.method(:key?))`. (2认同)

Joh*_*hat 20

@ Mori的方式是最好的,但这是另一种方式:

([:a, :b, :c, :d] - hash.keys).empty?
Run Code Online (Sandbox Code Playgroud)

要么

hash.slice(:a, :b, :c, :d).size == 4
Run Code Online (Sandbox Code Playgroud)


Mar*_*mas 14

只是在TIMTOWTDI的精神中,这是另一种方式.如果你require 'set'(在std lib中)那么你可以这样做:

Set[:a,:b,:c,:d].subset? hash.keys.to_set
Run Code Online (Sandbox Code Playgroud)


Chr*_*son 7

您可以通过以下方式获取缺失密钥的列表:

expected_keys = [:a, :b, :c, :d]
missing_keys = expected_keys - hash.keys
Run Code Online (Sandbox Code Playgroud)

如果您只想查看是否有任何丢失的密钥:

(expected_keys - hash.keys).empty?
Run Code Online (Sandbox Code Playgroud)


swi*_*osz 6

我喜欢这种方式解决这个问题:

subset = [:a, :b, :c, :d]
subset & hash.keys == subset
Run Code Online (Sandbox Code Playgroud)

它快速而清晰.

  • 是的,但问题不在于此. (4认同)
  • 除非需要严格匹配,否则无效.[:a,:b,:c,:d]&[:a,:b,:c,:d,:e] => [:a,:b,:c,:d] (2认同)