arrays - 比较两个具有相同键的哈希数组

标签 arrays ruby hash

我有 2 个具有相同键但不同值的哈希数组。

A = [{:a=>1, :b=>4, :c=>2},{:a=>2, :b=>1, :c=>3}]
B = [{:a=>1, :b=>1, :c=>2},{:a=>1, :b=>3, :c=>3}]

我正在尝试将 A 中的第一个哈希值与 B 中的第一个哈希值进行比较,依此类推,使用它们的键并确定哪个键和哪个值不匹配(如果它们不匹配)。请帮忙。

    A.each_key do |key|
      if A[key] ==  B[key]
        puts "#{key} match"
      else
        puts "#{key} dont match"

最佳答案

我不确定您想进行哪些比较,因此我将展示回答不同问题的方法。您想要对两个散列数组进行成对比较,但这实际上并不比仅比较两个散列更困难,正如我稍后将展示的那样。现在,假设您只想比较两个哈希值:

h1 = {:a=>1, :b=>4, :c=>2, :d=>3 }
h2 = {:a=>1, :b=>1, :c=>2, :e=>5 }

h1h2(或两者)中有哪些键?

h1.keys | h2.keys
  #=> [:a, :b, :c, :d, :e]

参见 Array#| .

两个哈希中有哪些键?

h1.keys & h2.keys
  #=> [:a, :b, :c] 

参见 Array#& .

哪些键在 h1 而不是 h2

h1.keys - h2.keys
  #=> [:d] 

参见 Array#- .

哪些键在 h2 而不是 h1

h2.keys - h1.keys #=> [:e] 

哪些键只在一个哈希中?

(h1.keys - h2.keys) | (h2.keys - h1.keys)
  #=> [:d, :e]

(h1.keys | h2.keys) - (h1.keys & h2.keys)

什么键在两个哈希中并且在两个哈希中具有相同的值?

(h1.keys & h2.keys).select { |k| h1[k] == h2[k] }
  #=> [:a, :c] 

参见 Array#select .

哪些键在两个哈希中并且在两个哈希中具有不同的值?

(h1.keys & h2.keys).reject { |k| h1[k] == h2[k] }
  #=> [:b] 

假设现在我们有两个哈希数组:

a1 = [{:a=>1, :b=>4, :c=>2, :d=>3 }, {:a=>2, :b=>1, :c=>3, :d=>4}]
a2 = [{:a=>1, :b=>1, :c=>2, :e=>5 }, {:a=>1, :b=>3, :c=>3, :e=> 6}]

并希望成对比较哈希值。为此,首先采用上面的兴趣计算并将其包装在一个方法中。例如:

def keys_in_both_with_different_values(h1, h2)
  (h1.keys & h2.keys).reject { |k| h1[k] == h2[k] }
end

然后写:

a1.zip(a2).map { |h1,h2| keys_in_both_with_different_values(h1, h2) }
  #=> [[:b], [:a, :b]]

参见 Enumerable#zip .

关于arrays - 比较两个具有相同键的哈希数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34123521/

相关文章:

html - 如果位于特定标签内,则删除特定标签

Javascript 哈希替换错误

php - 如何将Json插入mysql数据库?

javascript - 如何将一个数组值映射到另一个数组值以生成结果

c - golang中等效的结构数组

ruby-on-rails - Rails ActiveRecord - update_all : how to update multiple fields at once with mixed type of arguments

ruby - 使用在父模型中定义的作用域,在它的子模型中(STI 模式)

class - 关于 Raku 中 EVAL 中的哈希绑定(bind)的问题

c++ - 高效的 'rolling/moving hash' 计算(如移动平均值)

javascript - 按特定子级对 DOM 元素进行排序(无 JQuery)