检查一个散列是否包含另一个散列

Check that a hash includes another hash

鉴于我有一个散列数组 abc 和一个散列 ghi:

abc = [{
  'a' => '1',
  'b' => '2',
  'c' => '3',
  'd' => '4'
}]
ghi = {
  'a' => '1',
  'b' => '2'
}

abc 中选择包含 ghi 中所有键值对的哈希的最干净、最有效的方法是什么?

我能做到这一点:

abc.map {|n| n.slice(*ghi.keys) == ghi }.all?

虽然看起来不是很干净

不确定这是否是最快的。

abc.select{|hash| (ghi.to_a - hash.to_a).empty?}

在Ruby 2.3.

abc.select{|h| h >= ghi}

注意:这是在 OP 提到 Ruby 版本之前回答的。

Ruby 的早期版本:

abc.select{|h| h.merge(ghi) == h}

对于所有键和值的检查,您可以尝试:

abc = [
  {
    'a' => '1',
    'b' => '2',
    'c' => '3',
    'd' => '4'
  },
  {
    'a' => '33',
    'b' => '23'
  }
]
d = {
  'a' => '1',
  'b' => '2'
}
abc.select{|hash| ((hash.values <=> d.values) == 1 ) && ((hash.keys <=> d.keys) == 1 )}
# => [{"a"=>"1", "b"=>"2", "c"=>"3", "d"=>"4"}]
abc.select{|h| ghi.all?{|k,v| h.key?(k) && h.value?(v) } }

基准测试结果:

require 'benchmark'
Benchmark.bm do |x|
  x.report { 10000.times { abc.select{|h| ghi.all?{|k,v| h.key?(k) && h.value?(v) } } } }
  x.report { 10000.times { abc.select{|h| h.merge(ghi) == h } } }
  x.report { 10000.times { abc.select{|hash| (ghi.to_a - hash.to_a).empty? } } }
  x.report { 10000.times { abc.select{|hash| (hash.values <=> ghi.values) == (hash.keys <=> ghi.keys) } } }
end

       user     system      total        real
   0.040000   0.000000   0.040000 (  0.037253)
   0.040000   0.000000   0.040000 (  0.046138)
   0.150000   0.000000   0.150000 (  0.155893)
   0.020000   0.000000   0.020000 (  0.028176)

看起来 Rajarshi 的答案是所有答案中效率最高的。