首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我的散列是无序堆叠的..什么循环可以通过它们的散列ID来选择它们?

我的散列是无序堆叠的..什么循环可以通过它们的散列ID来选择它们?
EN

Stack Overflow用户
提问于 2011-02-02 02:14:16
回答 5查看 687关注 0票数 0

我的散列如下所示:

代码语言:javascript
运行
复制
{"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"}}

当我使用下面的代码遍历它时,顺序对我很重要:

代码语言:javascript
运行
复制
params[:payments].each_with_index do |item, idx|

通过这种方式,我可以添加在它们之前出现的日期。

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

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

代码语言:javascript
运行
复制
= 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!'
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-02 02:21:50

哈希在Ruby 1.8中是无序的,在Ruby 1.9中是按插入顺序排序的。您可以像在this thread中看到的那样,使用Enumerable#sort按键对散列进行排序。您得到的不是一个Hash,而是一个数组数组,其中第一个元素作为键,第二个元素作为值。您将需要解压这些包,以获得与each_with_index类似的内容。

代码语言:javascript
运行
复制
params[:payments].sort { |a, b| a[0].to_i <=> b[0].to_i }.each do |x|
  item = x[1]
  index = x[0]
  .....
end
票数 2
EN

Stack Overflow用户

发布于 2011-02-02 02:19:47

它具有类似的语法:

代码语言:javascript
运行
复制
(0..6).each do |idx| item=params[:payments][idx]
   # ...
end

显然,Hash按照键的插入顺序( http://www.ruby-doc.org/core/classes/Hash.html )保存键,因此您可以按以下方式重新创建一个排序的散列:

代码语言:javascript
运行
复制
Hash[params[:payments].sort]

(显然是从Ruby 1.9.2开始;可能并不是在所有实现中)

票数 1
EN

Stack Overflow用户

发布于 2011-02-02 02:28:04

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

您还可以将散列转换为数组,然后对该数组进行排序。

代码语言:javascript
运行
复制
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}]

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4866349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档