这里有很多好的答案,但我想指出它们可以很简单地扩展以实现更复杂的排序。你所需要做的就是使用OR运算符来链接比较函数,像这样:
objs.sort((a,b)=> fn1(a,b) || fn2(a,b) || fn3(a,b) )
在这里,
fn1
、
fn2
等是返回[-1, 0, 1]的排序函数。这将导致“按fn1排序”和“按fn2排序”,这与SQL中的ORDER BY基本相同。
该解决方案基于||运算符的行为,它计算为
可以转换为true的第一个计算表达式。
最简单的形式只有一个内联函数,如下所示:
// ORDER BY last_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) )
如果使用last_nom
和first_nom
两个步骤进行排序,结果将如下所示:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) ||
a.first_nom.localeCompare(b.first_nom) )
一个通用的比较函数 可以像这样:
// ORDER BY <n>
let cmp = (a,b,n)=>a[n].localeCompare(b[n])
这个函数可以扩展支持数字字段、大小写敏感性、任意数据类型等。
您可以通过排序优先级将它们链接在一起来使用它们:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> cmp(a,b, "last_nom") || cmp(a,b, "first_nom") )
// ORDER_BY last_nom, first_nom DESC
objs.sort((a,b)=> cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
// ORDER_BY last_nom DESC, first_nom DESC
objs.sort((a,b)=> -cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
这里的重点是,使用纯函数式JavaScript可以在不使用外部库或复杂代码的情况下帮助你走得更远。它也非常有效,因为不需要进行字符串解析。