所以我有一系列哈希:
[{"id":"30","name":"Dave"},
{"id":"57","name":"Mike"},
{"id":"9","name":"Kevin"},
...
{"id":"1","name":"Steve"}]
Run Code Online (Sandbox Code Playgroud)
我想按id属性对它进行排序,以便它看起来像这样:
[{"id":"1","name":"Steve"},
{"id":"2","name":"Walter"},
...
{"id":"60","name":"Chester"}]
Run Code Online (Sandbox Code Playgroud)
我假设我使用的sort_by方法,但我不确定如何做到这一点.
Mar*_*pka 19
这应该工作:
array.sort_by { |hash| hash['id'].to_i }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,sort_by优先选择sort因为它更有效.在sort调用to_i每次比较时,sort_by对数组中的每个元素执行一次并记住结果.
当我看到这样的传入数据时,它几乎总是一个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"}]
Run Code Online (Sandbox Code Playgroud)
这里唯一真正的诀窍是:
JSON[json_data]
Run Code Online (Sandbox Code Playgroud)
很多时候你会看到人们使用JSON.parse(json_data),但该[]方法足够聪明,可以识别它是获取字符串,数组还是哈希.如果它是一个字符串,它会尝试解析它,假设它是传入的数据.如果是数组或散列,则将其转换为JSON字符串以进行输出.结果是,使用JSON[...]简化了类的使用并使它成为我们不必使用parse或to_json.
否则,除非直接比较两个简单变量,例如整数到整数,字符串到字符串或字符到字符,否则使用sort_by优先于使用sort.一旦你必须潜入一个对象,或做一些计算来确定比较的方式,那么你应该使用sort_by.请参阅Wikipedia关于Schwartzian Transform的文章,以了解幕后发生的事情.这是一种非常强大的技术,可以显着加快排序速度.