我有一个简单的数组
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}]