在这种环境中,我只能访问内在的Javascript函数,因此无法加载外部库。
当尝试按3键(内部,中间和外部)排序时,似乎只保留了我的最后一种键。
function Claim(claimNumber, lastName, claimStatus, record)
{
this.claimNumber = claimNumber;
this.lastName = lastName;
this.claimStatus = claimStatus;
this.record = record;
}
function sortLastName(a, b) {
var o1 = a["lastName"].toUpperCase();
var o2 = b["lastName"].toUpperCase();
if (o1 < o2) return -1;
if (o1 > o2) return 1;
return 0;
}
function sortClaimNumber(a, b) {
var o1 = a["claimNumber"].toUpperCase();
var o2 = b["claimNumber"].toUpperCase();
if (o1 < o2) return -1;
if (o1 > o2) return 1;
return 0;
}
function sortClaimStatus(a, b) {
var o1 = ("00" + a["claimStatus"].toUpperCase()).substr(-2);
var o2 = ("00" + b["claimStatus"].toUpperCase()).substr(-2);
if (o1 < o2) return 1;
if (o1 > o2) return -1;
return 0;
}
var claimListArray = buildClaimList(record);
claimListArray.sort(sortClaimStatus);
claimListArray.sort(sortClaimNumber);
claimListArray.sort(sortLastName);
输出应该如下(lastname asc,claimnumber asc,claimstatus desc):
AARDVARK 111222A 15
AARDVARK 111222A 6
AARDVARK 111222A 1
AARDVARK 222555C 8
AARDVARK 222555C 4
BANKS 123132Z 78
但看起来像:
AARDVARK 111222A 15
AARDVARK 222555C 4
AARDVARK 111222A 1
AARDVARK 222555C 8
AARDVARK 111222A 6
BANKS 123132Z 78
也就是说,只保留lastName排序,就好像前两个排序没有发生一样。 有没有关于我忽略的数组和排序忽略以前的排序?
有更好的方法吗?
答案 0 :(得分:2)
试试这个
function comp(a, b){
var ret = sortLastName(a, b);
if(ret != 0){
return ret;
}
ret = sortClaimNumber(a, b);
if(ret != 0){
return ret;
}
return sortClaimStatus(a, b);
}
claimListArray.sort(comp);
编辑(作者Malvolio):
很抱歉要编辑你的帖子,但这个解决方案,虽然技术上是正确的,但是糟糕的Javascript。写得像这样:
claimListArray.sort(function(a, b) {
return sortLastName(a, b)
|| sortClaimNumber(a, b)
|| sortClaimStatus(a, b);
});
答案 1 :(得分:1)
您需要一个单一的排序方法,否则您将重新排序整个数组:
function sortAll(a, b) {
var o1 = ("00" + a["claimStatus"].toUpperCase()).substr(-2);
var o2 = ("00" + b["claimStatus"].toUpperCase()).substr(-2);
if (o1 < o2) return -1;
if (o1 > o2) return 1;
//If they are equal, compare with claimNumber
o1 = a["claimNumber"].toUpperCase();
o2 = b["claimNumber"].toUpperCase();
if (o1 < o2) return -1;
if (o1 > o2) return 1;
//If they are equal, compare with lastName
o1 = a["lastName"].toUpperCase();
o2 = b["lastName"].toUpperCase();
if (o1 < o2) return 1;
if (o1 > o2) return -1;
return 0;
}
答案 2 :(得分:0)
当然它会发生这种情况,因为您要在列表中更改Claim元素位置3次。每个删除先前设置的位置。要实现你想要的顺序,你不能只是对这个数组进行排序,而是从Claims键创建一个视图(可能是每个Claim的键为多行的多维数组)(可以在Claims元素中更改哪个位置)。
答案 3 :(得分:0)
尊重输入中等效项的现有顺序的排序称为stable
。正如您所注意到的,稳定性是一种重要的特征。 This question讨论了内置排序在不同浏览器中的稳定性。