0

在这种环境下,我只能访问内部 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排序,就好像前两种排序没有发生一样。是否有一些关于数组和排序的东西我错过了忽略以前的排序?

有更好的方法吗?

4

4 回答 4

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);

编辑(马伏里奥):

很抱歉编辑您的帖子,但这个解决方案虽然在技术上是正确的,但 Javascript 却很糟糕。像这样写:

claimListArray.sort(function(a, b) {
    return sortLastName(a, b)
        || sortClaimNumber(a, b)
        || sortClaimStatus(a, b);
});
于 2012-07-21T15:11:08.710 回答
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; 
}
于 2012-07-21T15:09:29.337 回答
0

当然会发生这种情况,因为您要更改列表中的 Claims 元素位置 3 次。每个删除先前设置的位置。要实现您想要的顺序,您不能只对这个数组进行排序,而是从 Claims 键(可以在 Claims 元素之间更改位置)创建一个视图(可能是多维数组,每个 Claim 的键为一行)。

于 2012-07-21T15:08:07.090 回答
0

尊重输入中等效项的现有顺序的排序称为stable。正如您所注意到的,稳定性是排序中的一个重要特征。 这个问题讨论了内置排序在不同浏览器中的稳定性。

于 2012-07-21T15:14:10.240 回答