目前我有一个数组,我想按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行。
非常感谢任何见解。
谢谢, 文森特
答案 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。
相反,您应该按照相同的顺序c
和d
:
if ( c.X > d.X ) { return 1; }
else if ( c.X < d.X ) { return -1; }
// -------^-----^
(或者您可以在else
中将其反转并使用>
代替<
。)
答案 1 :(得分: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)
&#13;