【问题标题】:Ruby on Rails - How to arrange elements of array in particular orderRuby on Rails - 如何以特定顺序排列数组元素
【发布时间】:2015-02-09 16:52:37
【问题描述】:

我的数组是:

[{:age=>28, :name=>"John", :id=>1}, {:name=>"David", :age=>20, :id=>2}]

订单:

[:id, :name, :age] or ['id', 'name', 'age']

结果应该是:

[{:id=>1, :name=>"John", :age=>28}, {:id=>2, :name=>"David", :age=>20}]

P/s:我使用的是 Ruby 1.8.7 和 Rails 2.3.5

谢谢

【问题讨论】:

  • Ruby 1.8.7 的 Hash 中未维护顺序
  • 如果你想要有序的哈希,你需要升级到 Ruby 1.9+。

标签: ruby-on-rails ruby arrays ruby-on-rails-2 ruby-1.8.7


【解决方案1】:

当涉及到哈希时,顺序并不重要。你不需要这样做。相信我。

您使用的是Hash,与Array 不同,它不关心位置。您只能通过 SymbolKey 访问该值。

所以,没有必要为所欲为。

【讨论】:

  • OP 明确要求对数组进行排序,而您正在谈论哈希。
  • OP 显然也在谈论哈希,如果您阅读了这个问题。
  • @ChrisHeald 是的,我将一个问题误读为“按哈希值对数组进行排序”。我很抱歉。
  • 我不同意。我在 v. 1.9+ 中充分利用了 Ruby 对密钥插入顺序的维护。
【解决方案2】:

正如其他人所说,使用 Ruby 1.87 或更早版本无法做到这一点。这是使用 Ruby 1.9+ 的一种方法:

arr = [{:age=>28, :name=>"John", :id=>1}, {:name=>"David", :age=>20, :id=>2}]
order = [:id, :name, :age]

arr.map { |h| Hash[order.zip(h.values_at(*order))] }
  #=> [{:id=>1, :name=>"John", :age=>28}, {:id=>2, :name=>"David", :age=>20}] 

在 Ruby 2.0+ 中,您可以编写:

arr.map { |h| order.zip(h.values_at(*order)).to_h }

我以为 1.8.7 和蒸汽机一起出去了。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2014-01-01
    相关资源
    最近更新 更多