我的哈希堆叠无序。什么是循环,可以通过他们的哈希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