2012-07-21 40 views
0

在這種環境下,我只能訪問內在的Javascript函數,所以無法加載外部庫。Javascript陣列排序多個鍵clobber以前排序?

當試圖用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); 

輸出應該像(姓氏遞增,claimnumber遞增,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 

也就是說,只有姓氏排序被保留下來,就好像前兩種排序沒有發生一樣。 是否有關於數組和排序的東西,我忽略了忽略以前的排序?

有沒有更好的方法?

回答

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); 
}); 
+0

這個完美的工作! – 2012-07-21 15:18:17

0

當然,這種情況發生的原因是您要更改列表中的Claims元素位置3次。每個刪除以前設置的位置。爲了達到你想要的順序,你不能對這個數組進行排序,而是從聲明鍵(這個位置可以在聲明元素中改變)創建一個視圖(可能是多維數組,每個聲明的鍵爲一行)。

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; 
} 
+0

我有這種方法最初沒有三層排序的完整結果。這就是爲什麼我認爲我最好嘗試完成3個完整的傳球,每個傳球都在不同的鑰匙上,從外部開始並移動。 – 2012-07-21 15:20:46

+0

除了鑰匙的優先順序之外,接受的答案和此答案之間沒有區別。 – Dennis 2012-07-21 15:37:29

+0

你是對的。我重新訪問了你的密鑰並進行了重新排序並進行了測試,它也是功能完備的。再次感謝。 – 2012-07-21 15:47:33

0

一個那種尊重的輸入等效項目的現有秩序被稱爲stable。正如你已經注意到的那樣,穩定性是一種重要的特徵。 This question討論了在不同瀏覽器中內置排序的穩定性。

+0

有趣,但我沒有使用瀏覽器。環境是封裝犀牛,並在那個舊的舊版。 – 2012-07-21 15:26:26

+0

檢查您的Rhino版本的文檔:如果「sort」條目不能保證穩定性,請按照HackerWins的建議使用庫排序或合併比較器。 – Malvolio 2012-07-21 19:28:36