2017-08-02 84 views
1

我想比较并找出两个嵌套散列与数组中的多个哈希数组之间的区别。在红宝石中比较哈希阵列

这个比较最好的方法是什么?它似乎没有图书馆或功能,可以帮助与此..

例如,我想以下两个例子散列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 
+0

change':modifiers => []'to':modifiers => set'? – halfelf

+0

在第二个例子中,'[''2222'=>'33333','4444'=>'55555'] => [{“2222”=>“33333”,“4444”=>“55555”}] '。我不知道你是否打算用这种方式写出散列或者忘记大括号,但是无论哪种方式当然都可以。 –

+0

你的问题不清楚。你想找出差异还是忽略这些差异? – Stefan

回答

2

这种递归溶液应与任何数量的嵌套数组和散列的水平的工作。

代码

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 

实例

实施例1

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 

实施例2

c = {"197315"=>{:qty=>1, 
       :modifiers=>[ 
        {"197322-197321"=>{ :qty=>1, 
             :modifiers=>['2222'=>'33333', '4444'=>'55555'] 
            } 
        }, 
        {"197323-197319"=>{:qty=>1} 
        } 
       ] 
       } 
    } 

d = {"197315"=>{:qty=>1, 
       :modifiers=>[ 
        {"197322-197321"=>{:qty=>1, 
            :modifiers=>['4444'=>'55555', '2222'=>'33333'] 
            } 
        }, 
        {"197323-197319"=>{:qty=>1} 
        } 
       ] 
       } 
    } 

arr_to_set(c) == arr_to_set(d) 
    #=> true 
+0

!!!!谢谢你,合法! – echan00

+1

echan00,不客气。看我的编辑。我能够简化很多。 –