在javascript中同时跨多个列进行排序,包括不同的方向和排序类型

在javascript中同时跨多个列进行排序,包括不同的方向和排序类型,javascript,arrays,sorting,Javascript,Arrays,Sorting,我看过很多关于排序的帖子,甚至有一些关于多列排序的帖子。他们似乎都非常了解列的数量、名称、排序类型和方向 我需要: 有一个通用的排序例程,在调用它之前不知道任何列名或其他排序条件。 它需要同时对条件中的所有列进行排序。 标准可能如下所示: [ {key: 'Employee', type: 'alpha', dir: 'asc'}, {key: 'ProjectCode', type: 'numeric', dir: 'desc'}, {key: 'WorkDate', type

我看过很多关于排序的帖子,甚至有一些关于多列排序的帖子。他们似乎都非常了解列的数量、名称、排序类型和方向

我需要:

有一个通用的排序例程,在调用它之前不知道任何列名或其他排序条件。 它需要同时对条件中的所有列进行排序。 标准可能如下所示:

[
  {key: 'Employee', type: 'alpha', dir: 'asc'}, 
  {key: 'ProjectCode', type: 'numeric', dir: 'desc'}, 
  {key: 'WorkDate', type: 'date', dir: 'desc'}
]
测试数据:

data = [
    {Employee: 'Harry Smith', ProjectCode: 3443, WorkDate: '1/5/18'},  
    {Employee: 'John Doe', ProjectCode: 3443, WorkDate: '1/7/18'},  
    {Employee: 'John Doe', ProjectCode: 3443, WorkDate: '1/5/18'},
    {Employee: 'John Doe', ProjectCode: 4574, WorkDate: '1/5/18'},  
    {Employee: 'John Doe', ProjectCode: 3443, WorkDate: '1/6/18'},  
    {Employee: 'Harry Smith', ProjectCode: 3443, WorkDate: '1/7/18'}
];
结果数据:

[
    {Employee: 'Harry Smith', ProjectCode: 3443, WorkDate: '1/7/18'},
    {Employee: 'Harry Smith', ProjectCode: 3443, WorkDate: '1/5/18'},  
    {Employee: 'John Doe', ProjectCode: 4574, WorkDate: '1/5/18'},  
    {Employee: 'John Doe', ProjectCode: 3443, WorkDate: '1/7/18'},  
    {Employee: 'John Doe', ProjectCode: 3443, WorkDate: '1/6/18'},  
    {Employee: 'John Doe', ProjectCode: 3443, WorkDate: '1/5/18'}
]

那么,如何构建一个排序例程,该例程可以使用这样的标准,并一次性对所有标准键进行排序呢?这意味着重复的员工将被分类在一起,在他们内部,重复的项目代码被分类在一起,在他们内部,重复的日期。

利用其他帖子中的一些想法,我想出了以下代码,似乎工作得很好,并以正确的顺序返回数组

数据=[ {员工:'Harry Smith',项目代码:3443,工作日期:'1/5/18'}, {员工:'John Doe',项目代码:3443,工作日期:'1/7/18'}, {员工:'John Doe',项目代码:3443,工作日期:'1/5/18'}, {员工:'John Doe',项目代码:4574,工作日期:'1/5/18'}, {员工:'John Doe',项目代码:3443,工作日期:'1/6/18'}, {员工:'Harry Smith',项目代码:3443,工作日期:'1/7/18'} ]; 分类标准=[ {key:'Employee',type:'alpha',dir:'asc'}, {key:'ProjectCode',type:'numeric',dir:'desc'}, {key:'WorkDate',type:'date',dir:'desc'} ]; data.sort函数a,b{ 变量x,y,i; 对于i=0;iy,则返回1; }否则{ 如果x>y,返回-1; 如果x控制台日志数据 我编写了一个相当简单的函数,它返回一个作用域函数,可以传递给Array.prototype.sort:

功能分类标准{ 常量符号={asc:1,desc:-1}; 常量排序={ 数值:a,b=>a-b, 日期:a,b=>新日期a-新日期b, alpha:a,b=>a.localeCompareb }; const compare=criteria.map {key,type,dir}=>a,b=>sign[dir]*sort[type]a[key],b[key] ; 返回a,b=>compare.reduceresult,fn=>result | | fna,b,0; } 让标准=[ {key:'Employee',type:'alpha',dir:'asc'}, {key:'ProjectCode',type:'numeric',dir:'desc'}, {key:'WorkDate',type:'date',dir:'desc'} ]; 让数据=[ {员工:'Harry Smith',项目代码:3443,工作日期:'1/5/18'}, {员工:'John Doe',项目代码:3443,工作日期:'1/7/18'}, {员工:'John Doe',项目代码:3443,工作日期:'1/5/18'}, {员工:'John Doe',项目代码:4574,工作日期:'1/5/18'}, {员工:'John Doe',项目代码:3443,工作日期:'1/6/18'}, {员工:'Harry Smith',项目代码:3443,工作日期:'1/7/18'} ];
console.logdata.sortsortBycriteria 您可以定义一些简单的函数来比较两个值,并将它们存储在一个对象中,以便通过sortCriteria对象的type属性进行访问

然后将排序结果作为返回值使用。这个方法迭代到数组的末尾,或者如果返回值为,那么这个值就是我们需要作为排序回调返回值的值。在某些回调函数中,方向和函数一起使用,用于使用函数的两个参数重新调整相对值

var数据=[{员工:'Harry Smith',项目代码:3443,工作日期:'1/5/18'},{员工:'John Doe',项目代码:3443,工作日期:'1/7/18'},{员工:'John Doe',项目代码:3443,工作日期:'1/5/18'},{员工:'John Doe',项目代码:4574,工作日期:'1/5/18'},{员工:'John Doe',项目代码:3443,工作日期:'1/6/18'},{员工:'Harry Smith',项目代码:3443,工作日期:'1/7/18'}, sortFn={ alpha:函数a,b{返回a.localeCompareb;}, 数值:函数a,b{返回a-b;}, 日期:函数a,b{返回新日期a-新日期b;} }, sortCriteria=[{key:'Employee',type:'alpha',dir:'asc'},{key:'ProjectCode',type:'numeric',dir:'desc'},{key:'WorkDate',type:'date',dir:'desc'}]; data.sort函数a、b{ var值=0; 返回sortCriteria.somefunction o{ 返回值=o.dir=='asc'| |-1*sortFn[o.type]a[o.key],b[o.key]; }&&value; }; 控制台日志数据;
.作为控制台包装器{max height:100%!important;top:0;}帮助我帮助你,你能分享你到目前为止的成果吗。Ele,我在发布问题的同时发布了我自己的答案,因为这是我之前提出的问题的翻版,同时
我想出了一个办法。然而,帕特里克和尼娜的答案比我的聪明多了。哎呀,我没意识到@JoelCool我没有投反对票,但投反对票的人可能没有意识到这是一个自我回答的问题,或者他们知道并认为这是一个太微不足道的用例,无法提供自我回答的问题。看起来我们的方法有很多重叠之处。你的是我的进步,还是你自己花了一点时间写的?有些是短路的,有些是减少的。这不是指控什么的,我看你用了一些。我只是特别注意到你使用了sortFn对象,这在第一次发布的答案中没有出现。谢谢Nina!我还没有完全理解它,所以我必须研究它。知道我为什么被否决了吗?@NinaScholz我在回答中加了一个注释,以澄清每个答案中短路发生的程度。谢谢Patrick!就像尼娜的答案一样,我需要研究一下,直到我明白为止。你只比尼娜领先了几分钟-@JoelCool你想让我对我的答案再解释一下吗?我可以详细介绍一下,但今晚我需要做。我在读了一些关于。一些和。减少的内容后,会得到一些。Nina对我来说更清楚一点,可能是因为我还不太熟悉ES6语法。这两种解决方案似乎都归结为返回适当的-1、1或0。你显然已经回答了这个问题。如果你觉得其他人会从解释中受益,我当然会。特别是criteria.map和compare.reduce。