我的哈希堆叠无序。什么是循环,可以通过他们的哈希ID选择它们?

我的哈希看起来像这样:

{"6"=>{":amount_paid"=>"100.00", ":date_paid"=>"4/22/2009"}, "0"=>{":amount_paid"=>"100.00", ":date_paid"=>"2/27/2008"}, "1"=>{":amount_paid"=>"80.00", ":date_paid"=>"3/27/2008"}, "2"=>{":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"}, "3"=>{":amount_paid"=>"100.00", ":date_paid"=>"6/20/2008"}, "4"=>{":amount_paid"=>"100.00", ":date_paid"=>"9/22/2008"}, "5"=>{":amount_paid"=>"100.00", ":date_paid"=>"2/20/2009"}} 

当我循环使用时,顺序对我很重要:

 params[:payments].each_with_index do |item, idx| 

通过这种方式,我可以添加日期之前的日期。

是否有一个循环可以找到序列"0".."6"并保持接近相同的语法?

我能想到的唯一另一种选择是确保这些参数按顺序堆叠。 它们来自这样的forms:

 = text_field_tag "payments[0][:date_paid]" = text_field_tag "payments[0][:amount_paid]" = text_field_tag "payments[1][:date_paid]" = text_field_tag "payments[1][:amount_paid]" = submit_tag 'punch it chewy!' 

散列在Ruby 1.8中是无序的,并通过在Ruby 1.9中插入来排序。 您可以使用Enumerable#sort按键对哈希进行排序 , 如此线程所示 。 你得到的不是哈希,而是一个数组数组,第一个元素作为键,第二个元素作为值。 您将需要解压缩这些以获得您想要的与each_with_index相似的each_with_index

 params[:payments].sort { |a, b| a[0].to_i <=> b[0].to_i }.each do |x| item = x[1] index = x[0] ..... end 

这有类似的语法:

 (0..6).each do |idx| item=params[:payments][idx] # ... end 

Hash显然按照插入顺序保存密钥( http://www.ruby-doc.org/core/classes/Hash.html ),因此您可以通过以下方式重新创建排序哈希:

 Hash[params[:payments].sort] 

(显然自Ruby 1.9.2以来;可能并非在所有实现中)

哈希是无序的。 有一个名为facets的gem,它有一个有序的字典对象。

您还可以将哈希转换为数组,然后对数组进行排序。

 thing = {"1" => {:paid => 100, :date => '1/1/2011'}, "2" => {:paid => 100, :date => '1/12/2011'}} thing.to_a.sort thing.inspect 

返回:[[“1”,{:date =>“1/1/1900”,:paid => 100}],[“2”,{:date =>“1/1/1900”,:paid = > 100}]]

然后,您可以按正确的顺序遍历数组。

 sorted_payments = params[:payments].keys.sort.map {|k| params[:payments][k]} 

返回按键值排序的哈希数组,然后可以使用.each枚举。 这比做(0..6)更通用,这可能(或可能不)有用。

 (0..6).each do |idx| item = params[:payments][idx] end