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

5

我觉得这应该很容易,而且我已经努力搜索了很久,但似乎无法使它工作。

我有以下哈希:

@friends = [{"name"=>"John Smith", "id"=>"12345"}, {"name"=>"Jane Doe", "id"=>"23456"}, {"name"=>"Samuel Jackson", "id"=>"34567"}, {"name"=>"Kate Upton", "id"=>"45678"}]

我希望按名称字母顺序对其进行排序。

目前我正在这样做:

@friends.sort{|a,b| a[0]<=>b[0]}

然而,它只会以非字母顺序输出完整结果。
2个回答

12
问题在于a和b是Hash,因此您必须使用"name"作为键或索引,而不是0。所以这应该可以解决问题。
@friends.sort{|a,b| a['name']<=>b['name']}

同时记得使用sort!来修改@friends变量或将其设置为结果

@friends.sort!{|a,b| a['name']<=>b['name']}
或者
@friends = @friends.sort{|a,b| a['name']<=>b['name']}

7

可以按键进行排序,但在执行此操作时,请注意键是字符串还是符号。

@friends.sort_by { |f| f['name'] }

如果您想让它不区分大小写,则可以始终执行以下操作:
@friends.sort_by { |f| f['name'].downcase }

当然,你可以始终使用 ! 将其保存回 @friends
>> @friends.sort_by! { |f| f['name'] }
>> @friends # now returns the sorted array of hashes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接