2017-05-09 33 views
0

目前我有一个数组,我想按3键排序。为简单起见,阵列看起来像这样:3键排序 - Javascript

bArray = [ 
{StartDate:"Mar 1, 2017", ID:"ABC-001", Serial:"10000", Qty: "1"}, 
{StartDate:"Jun 3, 2017", ID:"CDE-001", Serial:"10004", Qty: "1"}, 
{StartDate:"Mar 1, 2017", ID:"ABC-002", Serial:"10001", Qty: "3"}, 
{StartDate:"Apr 2, 2017", ID:"CDE-001", Serial:"10003", Qty: "1"}, 
{StartDate:"Mar 1, 2017", ID:"ABC-001", Serial:"10002", Qty: "1"}, 
] 

我想按所有3个按键升序排序。先按日期,然后按ID,然后按序列。

我设法让它适用于日期和ID,但是,当我在代码中添加串行比较时,出现意外结果,其中ID和串行可能有异常。

bArray = [ 
{StartDate:"Mar 1, 2017", ID:"ABC-001", Serial:"10000", Qty: "1"}, 
{StartDate:"Mar 1, 2017", ID:"ABC-002", Serial:"10001", Qty: "3"}, 
{StartDate:"Mar 1, 2017", ID:"ABC-001", Serial:"10002", Qty: "1"}, 
{StartDate:"Apr 2, 2017", ID:"CDE-001", Serial:"10003", Qty: "1"}, 
{StartDate:"Jun 3, 2017", ID:"CDE-001", Serial:"10004", Qty: "1"} 
] 

的第二和第三行应该被反转,因为ID应该优先于编号:例如,它可以是这样,当我运行的代码进行排序。

我的代码如下:

bArray.sort(function (c,d){ 
    if (c.StartDate > d.StartDate) { return 1; } 
    else if (d.StartDate < c.StartDate) { return -1; } 

    if (c.ID > d.ID) { return 1; } 
    else if (d.ID < c.ID) { return -1; } 

    if (c.Serial > d.Serial) { return 1; } 
    else if (d.Serial < c.Serial) { return -1; } 
    else { return 0; } 
}); 

我想还提到,我排数组是超过100条+线。

任何有识之士都非常感谢。

感谢, 文森特

+4

你有没有意识到你是通过串排序日期,而不是日期?串行按字符串排序,而不是数字排序。 – epascarello

+0

日期正常工作 - 它们是真实场景中的日期数据类型 串行可以是字符串或数字或两者的组合 –

回答

2

你的比较是所有形式

if (c.X > d.X) { return 1; } 
else if (d.X < c.X) { return -1; } 

这将永远不会返回-1;如果CX> DX,DX则CX <,但你已经回到1

相反,你应该有相同的顺序cd

if (c.X > d.X) { return 1; } 
else if (c.X < d.X) { return -1; } 
// -------^-----^ 

(或者你可以让他们在逆转在else和使用>代替<

+1

Downvoters:注意'else'子句中的'c'和'd'是相反的。两个子句都应该使用'>',或者'c'和'd'应该在两个子句中都是相同的顺序。 –

+0

谢谢!我看起来很蠢 –

0

按日期排序,你应该解析日期,那么你可以使用localeCompare字符串并最终改变Serial为数字。

var arr = [ 
 
{StartDate:"Mar 1, 2017", ID:"ABC-001", Serial:"10000", Qty: "1"}, 
 
{StartDate:"Jun 3, 2017", ID:"CDE-001", Serial:"10004", Qty: "1"}, 
 
{StartDate:"Mar 1, 2017", ID:"ABC-002", Serial:"10001", Qty: "3"}, 
 
{StartDate:"Apr 2, 2017", ID:"CDE-001", Serial:"10003", Qty: "1"}, 
 
{StartDate:"Mar 1, 2017", ID:"ABC-001", Serial:"10002", Qty: "1"}, 
 
] 
 
arr.sort(function(a, b) { 
 
    return Date.parse(a.StartDate) - Date.parse(b.StartDate) || 
 
    a.ID.localeCompare(b.ID) || +a.Serial - +b.Serial 
 
}); 
 

 
console.log(arr)