按3键排序 - Javascript

时间:2017-05-09 15:45:40

标签: javascript arrays sorting

目前我有一个数组,我想按3键排序。为简单起见,数组如下所示:

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,再按序列。

我设法让它适用于Date和ID,但是,当我在代码中添加Serial比较时,我得到了意想不到的结果,其中ID和Serial可能有异常。例如,当我运行代码时,它可能会像这样排序:

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应该优先于Serial。

我的代码如下:

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行。

非常感谢任何见解。

谢谢, 文森特

2 个答案:

答案 0 :(得分:2)

您的比较是所有形式的

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

这永远不会返回-1;如果c.X&gt; d.X,然后d.X&lt; c.X,但你已经返回1。

相反,您应该按照相同的顺序cd

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

(或者您可以在else中将其反转并使用>代替<。)

答案 1 :(得分:0)

要按日期排序,您应该解析日期,然后您可以使用localeCompare表示字符串,最后将Serial更改为数字。

&#13;
&#13;
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)
&#13;
&#13;
&#13;