Iterate HashWithIndifferentAccess

How do I iterate a HashWithIndifferentAccess? I need to set the order
using a sortable_element.

first check out the class of the object, if its a hash do

HashWithIndifferentAccess.each do |key, value|
puts key
puts value
end

if it's a hash, its order is not guaranteed... next time you iterate
it, you might find it's in a different order

Pål Bergström wrote:

How do I iterate a HashWithIndifferentAccess? I need to set the order
using a sortable_element.

As Michael said, order is not guaranteed -- even if you include an
element for that.

When I need to count on the order I use an array of pairs. I use this
for value list data. It's not as handy as Lasso's array of pairs which
are sortable and searchable, but it's a close as we get.

list = [ ["Small", "S"], ["Medium","M"], ["Large","L"] ]

If you have to start with the Hash, and it includes a sort number of
some type, then you can modify the conversion to specifically retrieve
the by the sort number.

If you need help with that, give an exampe of the exact data structure
you'd be starting with.

-- gw

Greg Willits wrote:

If you need help with that, give an exampe of the exact data structure
you'd be starting with.

With the help of sortable_element and :tree set as true (and moving up
item 3 before item 1, just as a test) I get a Hash from this list:

<ul>
<li id="3"></li>
<li id="1"></li>
<li id="5"><ul><li id="6"></li></ul></li>
<li id="7"></li>
</ul>

The hash:

{"0"=>{"id"=>"3"}, "1"=>{"id"=>"1"}, "2"=>{"0"=>{"id"=>"6"}, "id"=>"5",
"1"=>{"id"=>"7"}}}

I can sort out the key and value. But with key nr 2 I have problem (id 5
with sub list containing id 6). If I use params[:mylist].each do |k,v| I
only get the key of 2 and value 5. How do I deal with a nested hash like
that?

I hope I make sense.

i hash inside a hash i read it list[:outer_value][:deeper_value] and you can do

list.each do |key,value|
if value.class == ‘Hash’
puts “values for key #{ key}”
value.each do | key2,value2|
puts “key: #{key2} and value: #{value2}”
end
else
puts “key: #{key} and value: #{value}”
end
end

radhames brito wrote:

i hash inside a hash i read it list[:outer_value][:deeper_value] and
you
can do

  list.each do |key,value|
   if value.class == 'Hash'
      puts "values for key #{ key}"
       value.each do | key2,value2|
             puts "key: #{key2} and value: #{value2}"
        end
   else
       puts "key: #{key} and value: #{value}"
   end
  end

Perfect. Thanks.