在ruby中排序JSON哈希数组

Cri*_*ano 8 ruby

所以我有一系列哈希:

[{"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对数组中的每个元素执行一次并记住结果.


the*_*Man 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"}]
Run Code Online (Sandbox Code Playgroud)

这里唯一真正的诀窍是:

JSON[json_data]
Run Code Online (Sandbox Code Playgroud)

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

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