检查哈希是否包含另一个哈希

时间:2015-12-11 13:34:43

标签: ruby hash ruby-1.9

鉴于我有一系列哈希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?

虽然它看起来不是很干净。

4 个答案:

答案 0 :(得分:8)

在Ruby 2.3中。

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

注意:在OP提到Ruby版本之前已经回答了这个问题。

Ruby的早期版本:

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

答案 1 :(得分:2)

不确定这是否是最快的。

jake
Hello
mark
ted
Hello

答案 2 :(得分:0)

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

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"}]

答案 3 :(得分:0)

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的回答是所有答案中最有效的。