我的散列如下所示:
{"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"的序列并保持相同的语法?
我能想到的唯一另一种选择是确保这些参数按顺序堆叠。它们来自这样的表单:
= 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!'发布于 2011-02-02 02:21:50
哈希在Ruby 1.8中是无序的,在Ruby 1.9中是按插入顺序排序的。您可以像在this thread中看到的那样,使用Enumerable#sort按键对散列进行排序。您得到的不是一个Hash,而是一个数组数组,其中第一个元素作为键,第二个元素作为值。您将需要解压这些包,以获得与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发布于 2011-02-02 02:19:47
它具有类似的语法:
(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开始;可能并不是在所有实现中)
发布于 2011-02-02 02:28:04
散列是无序的。有一个名为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}]
然后,您可以按正确的顺序遍历数组。
https://stackoverflow.com/questions/4866349
复制相似问题