Ruby 按条件搜索散列
Ruby searching hash by criteria
如何将数组哈希与单个哈希进行比较,以及return包含比较结果的新哈希数组。
例如:
stored_hash = [
{:a => 1, :b => 2, :c => 3},
{:a => 1, :b => 3, :c => 4}
]
compare_hash = {:a => 1}
stored_hash.some_function_here(compare_hash)
应该return:
[
{:a => 1, :b => 2, :c => 3},
{:a => 1, :b => 3, :c => 4}
]
同时:
stored_hash = [
{:a => 1, :b => 2, :c => 3},
{:a => 1, :b => 3, :c => 4}
]
compare_hash = {:a => 1, :b => 3}
stored_hash.some_function_here(compare_hash)
应该return:
[
{:a => 1, :b => 3, :c => 4}
]
除非你想猴子补丁 Array
,否则你不会在 stored_hash
上调用方法,但你可以这样做:
def some_function(haystack, needle)
haystack.select do |hash|
needle.all? { |k,v| hash[k] == v }
end
end
然后用
调用它
some_function(stored_hash, compare_hash)
此外,请注意您的 stored_hash
不是散列,而是数组;这个名字有点误导。
这是一种方法,使用 Array#keep_if
and Hash#merge
stored_hash.keep_if {|hash| hash.merge(compare_hash) == hash}
你可以这样做:
def matches(stored_hash, compare_hash)
stored_hash.select do |h|
h.values_at(*compare_hash.keys) == compare_hash.values
end
end
stored_hash = [
{:a => 1, :b => 2, :c => 3},
{:a => 1, :b => 3, :c => 4}
]
compare_hash = {:a => 1}
matches(stored_hash, compare_hash)
#=> [{:a=>1, :b=>2, :c=>3}, {:a=>1, :b=>3, :c=>4}]
compare_hash = {:a => 1, :b => 3}
matches(stored_hash, compare_hash)
#=> [{:a=>1, :b=>3, :c=>4}]
另一种方式:
def find_matches(stored_hash, compare_hash)
stored_hash.find_all {|h| h.to_a & compare_hash.to_a == compare_hash.to_a}
end
compare_hash = {:a=>1, :b=>2}
find_matches(stored_hash, compare_hash)
#=> [{:a=>1, :b=>2, :c=>3}]
compare_hash = {:a=>1}
find_matches(stored_hash, compare_hash)
#=> [{:a=>1, :b=>2, :c=>3}, {:a=>1, :b=>3, :c=>4}]
如何将数组哈希与单个哈希进行比较,以及return包含比较结果的新哈希数组。
例如:
stored_hash = [
{:a => 1, :b => 2, :c => 3},
{:a => 1, :b => 3, :c => 4}
]
compare_hash = {:a => 1}
stored_hash.some_function_here(compare_hash)
应该return:
[
{:a => 1, :b => 2, :c => 3},
{:a => 1, :b => 3, :c => 4}
]
同时:
stored_hash = [
{:a => 1, :b => 2, :c => 3},
{:a => 1, :b => 3, :c => 4}
]
compare_hash = {:a => 1, :b => 3}
stored_hash.some_function_here(compare_hash)
应该return:
[
{:a => 1, :b => 3, :c => 4}
]
除非你想猴子补丁 Array
,否则你不会在 stored_hash
上调用方法,但你可以这样做:
def some_function(haystack, needle)
haystack.select do |hash|
needle.all? { |k,v| hash[k] == v }
end
end
然后用
调用它some_function(stored_hash, compare_hash)
此外,请注意您的 stored_hash
不是散列,而是数组;这个名字有点误导。
这是一种方法,使用 Array#keep_if
and Hash#merge
stored_hash.keep_if {|hash| hash.merge(compare_hash) == hash}
你可以这样做:
def matches(stored_hash, compare_hash)
stored_hash.select do |h|
h.values_at(*compare_hash.keys) == compare_hash.values
end
end
stored_hash = [
{:a => 1, :b => 2, :c => 3},
{:a => 1, :b => 3, :c => 4}
]
compare_hash = {:a => 1}
matches(stored_hash, compare_hash)
#=> [{:a=>1, :b=>2, :c=>3}, {:a=>1, :b=>3, :c=>4}]
compare_hash = {:a => 1, :b => 3}
matches(stored_hash, compare_hash)
#=> [{:a=>1, :b=>3, :c=>4}]
另一种方式:
def find_matches(stored_hash, compare_hash)
stored_hash.find_all {|h| h.to_a & compare_hash.to_a == compare_hash.to_a}
end
compare_hash = {:a=>1, :b=>2}
find_matches(stored_hash, compare_hash)
#=> [{:a=>1, :b=>2, :c=>3}]
compare_hash = {:a=>1}
find_matches(stored_hash, compare_hash)
#=> [{:a=>1, :b=>2, :c=>3}, {:a=>1, :b=>3, :c=>4}]