【问题标题】:Sorting an array of hashes in Ruby (sorting by presence optional key+value)在 Ruby 中对哈希数组进行排序(按存在可选键 + 值排序)
【发布时间】:2013-04-22 05:58:41
【问题描述】:

得到一个像这样的 Ruby 数组:

[  { "lat" => 123, "lon" => 456 },
   { "lat" => 789, "lon" => 102, "col" => "red" },
   { "lat" => 442, "lon" => 342 } ]

我想对它进行排序,以便 anycol 为键的散列被推到数组的顶部或底部。

无法找出正确的sort_by 语法/语义。

【问题讨论】:

  • 顶部或底部;哪个?
  • 你写了什么代码?

标签: ruby arrays hash sorting


【解决方案1】:
a = [  { "lat" => 123, "lon" => 456 },
   { "lat" => 789, "lon" => 102, "col" => "red" },
   { "lat" => 442, "lon" => 342 } ]

如果你想把它们放在上面,那么

a.partition{|h| h.key?("col")}.flatten

如果你想把它们放在底部,那么按照铁皮人的建议,

a.partition{|h| h.key?("col").!}.flatten

【讨论】:

  • 要将它们放在底部,请尝试 !h.key?('col') 并删除 reverse。他们应该完成同样的事情,但减少工作量。
【解决方案2】:

我一直喜欢的更实用的方法:

require 'pp'

a = [ {:foo => "aa","col" => "bar"}, { "lat" => 123, "lon" => 456 },
   { "lat" => 789, "lon" => 102, "col" => "red" },
   { "lat" => 442, "lon" => 342 } ]

arr = a.group_by{|h| h.key?("col")}

pp arr[false] + arr[true] # on the bottom

输出:

[{"lat"=>123, "lon"=>456},
 {"lat"=>442, "lon"=>342},
 {:foo=>"aa", "col"=>"bar"},
 {"lat"=>789, "lon"=>102, "col"=>"red"}]

pp arr[true] + arr[false] #on the top

输出:

[{:foo=>"aa", "col"=>"bar"},
 {"lat"=>789, "lon"=>102, "col"=>"red"},
 {"lat"=>123, "lon"=>456},
 {"lat"=>442, "lon"=>342}]

【讨论】:

  • 感谢@RubyLovely
猜你喜欢
  • 2011-10-25
  • 1970-01-01
  • 2011-11-26
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 2011-02-02
相关资源
最近更新 更多