我有多个排序标准
我有一个我指定的排序顺序。 (我根据我的标准吐出1个,2个,3个,4个)
我有第1步和第2步工作。坚持第3步。操作也很昂贵,所以如果我可以避免,我不想多次迭代列表。
我知道我可以先将列表过滤成2个不同的数组(例如将sort_order组1到3组合成一个数组),将sort_order 4过滤到另一个数组中,然后在第二个数组上调用reverse。但这需要我多次迭代列表。
@assignments.sort_by do |a|
sort_date = if(a.sort_order == 1 || a.sort_order == 4)
a.due_date
else
a.start_date
end
[a.sort_order, sort_date]
end
示例输入 -
[{name: item 1, start_date: "08/01/2016", due_date: "08/15/2016", sort_order: 3},
{name: item 2, start_date: "08/02/2016", due_date: "08/20/2016", sort_order: 3},
{name: item 3, start_date: "06/01/2016", due_date: nil, sort_order: 2},
{name: item 4, start_date: "06/01/2016", due_date: "07/15/2016", sort_order: 1},
{name: item 5, start_date: "07/01/2016", due_date: "07/07/2016", sort_order: 1},
{name: item 6, start_date: "01/01/2015", due_date: "01/15/2015", sort_order: 4},
{name: item 7, start_date: "01/01/2016", due_date: "01/15/2016", sort_order: 4},]
预期产出的顺序
item 5
item 4
item 3
item 1
item 2
item 7
item 6
基本上按当前,未来,过去对作业进行排序。
答案 0 :(得分:2)
只需使用日期的负值来降序排序。
@assignments.sort_by do |a|
case a.sort_order
when 1 then [1, a.due_date]
when 2 then [2, a.start_date]
when 3 then [3, a.start_date]
when 4 then [4, -a.due_date]
end
end