比较Ruby中的哈希数组

时间:2017-08-02 02:20:57

标签: arrays ruby hash

我正在尝试比较并找到两个嵌套的哈希值与数组中的多个哈希数组之间的区别。

进行此比较的最佳方法是什么?似乎没有可以帮助解决这个问题的库或函数。

例如,我希望下面两个散列a和散列b的例子被认为是相等的。

pry(main)> a
#⇒ {"197315"=>{:qty=>1,
#              :modifiers=>[{"197323-197319"=>{:qty=>1}},
#                           {"197322-197321"=>{:qty=>1}}]}}

pry(main)> b
#⇒ {"197315"=>{:qty=>1,
#              :modifiers=>[{"197322-197321"=>{:qty=>1}},
#                           {"197323-197319"=>{:qty=>1}}]}}

pry(main)> a == b
#⇒ false

pry(main)> a
#⇒ {"197315"=>{:qty=>1,
#              :modifiers=>[{"197322-197321"=>{
#                :qty=>1,
#                :modifiers=>['2222'=>'33333', '4444'=>'55555']}}, 
#                           {"197323-197319"=>{:qty=>1}}]}}

pry(main)> b
#⇒ {"197315"=>{:qty=>1,
#              :modifiers=>[{"197322-197321"=>{
#                :qty=>1,
#                :modifiers=>['4444'=>'55555', '2222'=>'33333']}},
#                            {"197323-197319"=>{:qty=>1}}]}}

pry(main)> a == b
#⇒ false

1 个答案:

答案 0 :(得分:2)

这种递归解决方案应该适用于任意数量级别的嵌套数组和哈希值。

<强>代码

XMLHttpRequest

<强>实施例

示例1

require 'set'

def arr_to_set(o)
  case o
  when Hash
    o.each_with_object({}) { |(k,v),g| g[k] = arr_to_set(v) }
  when Array
    o.map { |e| arr_to_set(e) }.to_set
  else
    o
  end
end

示例2

a = {"197315"=>{:qty=>1, :modifiers=>[
                           {"197323-197319"=>{:qty=>1}},
                           {"197322-197321"=>{:qty=>1}}
                         ]
               }
    }

b = {"197315"=>{:qty=>1, :modifiers=>[
                           {"197322-197321"=>{:qty=>1}},
                           {"197323-197319"=>{:qty=>1}}
                         ]
               }
    }

arr_to_set(a) == arr_to_set(b)
  #=> true