Javascript数组排序多个键clobber以前的排序?

时间:2012-07-21 14:59:46

标签: javascript

在这种环境中,我只能访问内在的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 个答案:

答案 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讨论了内置排序在不同浏览器中的稳定性。