忽略数组中散列的简单排序问题



我有一个简单的数组

my_array=[{id:1,priority_score:2},{id:3,prioriity_score:5},{id:4,pririty_score:3.5}…]

我正在尝试使用按优先级分数排序

sort_array=my_array.sort_by{| priority|priority[:priority_score]}

奇怪的是,我并没有从原来的数组中得到任何区别。

我使用创建优先级分数

new_hash={id:h.id,priority_score:(a.score+b.score)/2}

并添加了各种.to_f.to_i,以防问题是优先级分数没有被识别为数字,但这不是问题所在。

有什么建议吗?

您可以像这样使用sort_by

my_array.sort_by {|(h, _)| h[:priority_score]}
# [{:id=>1, :priority_score=>2}, {:id=>4, :priority_score=>3.5}, {:id=>3, :priority_score=>5}]

Array#sort方法获取一个具有两个参数a和b的块,并希望您手动比较它们。考虑到如何调用它,我认为您需要sort_by,它为数组中的每个项获取一个块,执行一些转换,并根据结果进行排序。

排序得到两个元素,并根据这些元素的比较结果进行排序。

此比较应返回-1,0,1。

0表示相等,先-1<second和+1 first>second。

在大多数情况下,您可以使用ruby内置函数<=>

例如:

my_array = [{id:1,priority_score:2},{id:3,priority_score:5},{id:4,priority_score:3.5}]
# Sort ascending  
cr = my_array.sort {|a,b| a[:priority_score] <=> b[:priority_score]}
#[{:id=>1, :priority_score=>2}, {:id=>4, :priority_score=>3.5}, {:id=>3, :priority_score=>5}]
# Sort descending
de = my_array.sort {|a,b| b[:priority_score] <=> a[:priority_score]}
#[{:id=>3, :priority_score=>5}, {:id=>4, :priority_score=>3.5}, {:id=>1, :priority_score=>2}]

最新更新