我有一个简单的数组
my_array = [{id:1,priority_score:2},{id:3,priority_score:5},{id:4,priority_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
,以防问题是优先级分数未被识别为数字,但这不是问题。
有什么建议吗?
答案 0 :(得分:1)
Array#sort
方法采用带有两个参数a和b的块,并希望您手动比较它们。鉴于你如何调用它,我想你想要sort_by
,它对数组中的每个项进行一个块,执行一些转换,然后按结果排序。
答案 1 :(得分:1)
您可以像这样使用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}]
答案 2 :(得分:1)
sort有两个元素,排序由这些元素的比较结果完成。
此比较应返回-1,0,1。
0表示相等,-1表示第一个<第二个和+1第一个>第二
在大多数情况下,您可以使用内置函数的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}]