2017-05-09 64 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)