鉴于我有一系列哈希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?
虽然它看起来不是很干净。
答案 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的回答是所有答案中最有效的。