在ruby中排序JSON哈希数组

时间:2013-10-28 13:33:19

标签: ruby

所以我有一系列哈希:

[{"id":"30","name":"Dave"},
 {"id":"57","name":"Mike"},
 {"id":"9","name":"Kevin"},
 ...
 {"id":"1","name":"Steve"}]

我希望按id属性对其进行排序,以便它看起来像这样:

[{"id":"1","name":"Steve"},
 {"id":"2","name":"Walter"},
 ...
 {"id":"60","name":"Chester"}]

我假设我使用sort_by方法,但我不确定该怎么做。

3 个答案:

答案 0 :(得分:17)

这应该有效:

array.sort_by { |hash| hash['id'].to_i }

在这种情况下,sort_by优先于sort,因为它效率更高。虽然sort在每次比较时调用to_i,但sort_by会对数组中的每个元素执行一次并记住结果。

答案 1 :(得分:5)

当我看到这样的传入数据时,它几乎总是一个JSON字符串。 Ruby不会自动理解JSON,也不会自动知道如何转换它,但Ruby确实让我们很容易从它转换成它:

require 'json'

json_data = '[{"id":"30","name":"Dave"},
 {"id":"57","name":"Mike"},
 {"id":"9","name":"Kevin"},
 {"id":"1","name":"Steve"}]'

ary = JSON[json_data].sort_by{ |e| e['id'].to_i }
ary 
# => [{"id"=>"1", "name"=>"Steve"}, {"id"=>"9", "name"=>"Kevin"}, {"id"=>"30", "name"=>"Dave"}, {"id"=>"57", "name"=>"Mike"}]

这里唯一真正的诀窍是:

JSON[json_data]

很多时候你会看到人们使用JSON.parse(json_data),但[]方法足够聪明,可以识别它是获取字符串,数组还是哈希。如果它是一个字符串,它会尝试解析它,假设它是传入的数据。如果是数组或散列,则将其转换为JSON字符串以进行输出。结果是,使用JSON[...]简化了类的使用并使其成为可能,因此我们不必使用parseto_json

否则,使用sort_by优先于使用sort,除非您直接比较两个简单变量,如整数到整数,字符串到字符串或字符到字符。一旦你必须潜入一个对象,或做某种计算以确定比较的方式,那么你应该使用sort_by。请参阅Wikipedia's article on Schwartzian Transform以了解幕后发生的情况。这是一种非常强大的技术,可以显着加快排序速度。

答案 2 :(得分:2)

你的哈希语法是错误的,如果它们符号那么它会是这样的:

data = [
  {id:"30", name:"Dave"},
  {id:"57", name:"Mike"},
  {id:"9", name:"Kevin"},
  {id:"1", name:"Steve"}
] 
sorted_data = data.sort_by{|x| x[:id].to_i}

编辑:忘记to_i,修复。如果键是字符串,那么:定义哈希的方法不起作用,所以我们需要哈希火箭:

data = [{"id"=>"30","name"=>"Dave"},
 {"id"=>"57","name"=>"Mike"},
 {"id"=>"9","name"=>"Kevin"},
 {"id"=>"1","name"=>"Steve"}]

sorted_data = data.sort_by{|x| x['id'].to_i}