How to test order-conscious equality of hashes

2019-06-24 07:43发布

问题:

Ruby 1.9.2 introduced order into hashes. How can I test two hashes for equality considering the order?

Given:

h1 = {"a"=>1, "b"=>2, "c"=>3}
h2 = {"a"=>1, "c"=>3, "b"=>2}

I want a comparison operator that returns false for h1 and h2. Neither of the followings work:

h1 == h2 # => true
h1.eql? h2 # => true

回答1:

Probably the easiest is to compare the corresponding arrays.

h1.to_a == h2.to_a


回答2:

You could compare the output of their keys methods:

h1 = {one: 1, two: 2, three: 3} # => {:one=>1, :two=>2, :three=>3}
h2 = {three: 3, one: 1, two: 2} # => {:three=>3, :one=>1, :two=>2}
h1 == h2 # => true
h1.keys # => [:one, :two, :three]
h2.keys # => [:three, :one, :two]
h1.keys.sort == h2.keys.sort # => true
h1.keys == h2.keys # => false

But, comparing Hashes based on key insertion order is kind of strange. Depending on what exactly you're trying to do, you may want to reconsider your underlying data structure.