按字段按字母顺序对哈希值进行排序

use*_*798 5 ruby

我认为这很容易,而且已经很难找到了,但似乎无法让它发挥作用.

我有以下哈希:

@friends = [{"name"=>"John Smith", "id"=>"12345"}, {"name"=>"Jane Doe", "id"=>"23456"}, {"name"=>"Samuel Jackson", "id"=>"34567"}, {"name"=>"Kate Upton", "id"=>"45678"}]
Run Code Online (Sandbox Code Playgroud)

我试图按名称字母顺序排序.

现在我正在这样做:

@friends.sort{|a,b| a[0]<=>b[0]}
Run Code Online (Sandbox Code Playgroud)

但是,它只是以非字母顺序输出完整结果.

Ism*_*reu 12

问题是a和b是Hash,所以你必须使用"name"作为键或索引而不是0.所以这应该这样做

@friends.sort{|a,b| a['name']<=>b['name']}
Run Code Online (Sandbox Code Playgroud)

还记得使用排序!修改@friends变量或将其设置为结果

@friends.sort!{|a,b| a['name']<=>b['name']}
Run Code Online (Sandbox Code Playgroud)

要么

@friends = @friends.sort{|a,b| a['name']<=>b['name']}
Run Code Online (Sandbox Code Playgroud)


Mat*_*des 7

可以通过键进行排序,只需要知道在执行此操作时键是字符串还是符号.

@friends.sort_by { |f| f['name'] }
Run Code Online (Sandbox Code Playgroud)

如果你想让它不区分大小写,你可以随时做:

@friends.sort_by { |f| f['name'].downcase }
Run Code Online (Sandbox Code Playgroud)

当然,你可以随时使用它!来保存它@friends

>> @friends.sort_by! { |f| f['name'] }
>> @friends # now returns the sorted array of hashes
Run Code Online (Sandbox Code Playgroud)