所以我有一系列哈希:
[{"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
方法,但我不确定该怎么做。
答案 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[...]
简化了类的使用并使其成为可能,因此我们不必使用parse
或to_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}