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

つまり、最初の2つの並べ替えが行われなかったかのように、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

もちろん、リスト内のクレーム要素の位置を3回変更しているため、このようになります。それぞれが以前に設定された位置を削除します。必要な順序を実現するには、この配列を並べ替えるだけでなく、クレームキー(クレーム要素間で位置を変更できます)からビュー(各クレームのキーを1行に持つ多次元配列)を作成します。

于 2012-07-21T15:08:07.090 に答える
0

入力内の同等のアイテムの既存の順序を尊重するソートは、と呼ばれstableます。お気づきのように、安定性はある種の重要な機能です。 この質問では、さまざまなブラウザでの組み込みの並べ替えの安定性について説明します。

于 2012-07-21T15:14:10.240 に答える