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