8

所以我有一个哈希数组:

[{"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方法,但我不确定该怎么做。

4

3 回答 3

21

这应该有效:

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

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

于 2013-10-28T13:34:59.350 回答
6

当我看到这样的传入数据时,它几乎总是一个 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 字符串以进行输出。结果是, usingJSON[...]简化了类的使用,并使得我们不必使用parseor to_json

否则,使用sort_by优于使用sort,除非您直接比较两个简单变量,如整数与整数、字符串与字符串或字符与字符。一旦您必须深入研究一个对象,或进行某种计算以确定事物的比较方式,那么您应该使用sort_by. 请参阅Wikipedia 关于 Schwartzian Transform 的文章以了解幕后发生的事情。这是一种非常强大的技术,可以显着加快排序速度。

于 2013-10-28T15:46:07.053 回答
2

您的 Hash 语法是错误的,如果它们是符号,那么它看起来像这样:

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}
于 2013-10-28T13:35:56.887 回答