【问题标题】:My hashes are stacking unordered..What's a loop that can select them by their Hash ID?我的哈希是无序堆叠的。可以通过哈希 ID 选择它们的循环是什么?
【发布时间】:2011-06-19 11:26:28
【问题描述】:

我的哈希显示如下:

{"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!'

【问题讨论】:

  • 请注意,在 Ruby 1.9 中,哈希是有序的。在 Ruby 1.8 中,它们不是。如果在 1.8 中使用 Rails,您可以在需要排序时使用 ActiveSupport::OrderedHash 类。
  • "你可以在需要订单时使用 ActiveSupport::OrderedHash 类",请记住维护订单会产生开销。忽略顺序通常更快,然后在检索内容之前对键进行排序。

标签: ruby-on-rails ruby forms hash


【解决方案1】:

哈希在 Ruby 1.8 中是无序的,而在 Ruby 1.9 中通过插入来排序。您可以使用Enumerable#sort 按关键字对哈希进行排序,如this thread 所示。你得到的不是一个哈希,而是一个数组数组,第一个元素作为键,第二个元素作为值。您需要解压这些文件才能获得类似于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

【讨论】:

  • 在 Ruby 1.9 中,Hash es 按插入排序的。
【解决方案2】:

这有类似的语法:

(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 开始;也许不是在所有实现中)

【讨论】:

    【解决方案3】:

    哈希是无序的。有一个叫做 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}]]

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

    【讨论】:

      【解决方案4】:
      sorted_payments = params[:payments].keys.sort.map {|k| params[:payments][k]}
      

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

      【讨论】:

        【解决方案5】:
        (0..6).each do |idx|
          item = params[:payments][idx]
        end
        

        【讨论】:

          猜你喜欢
          • 2010-09-13
          • 2021-09-22
          • 2013-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多