1

このトピックに関する私の最初の質問に答えて、それは私が前進するのを助けたので、これが重複しているように思われる場合はお詫び申し上げます。最初の例から先に進み、ネストされた配列の各要素の位置(1)の値に基づいて、ネストされた配列の要素をランク付けしようとしています。以下は、数値配列でうまく機能します。

function mySorting(a, b) {
    return a == b ? 0 : (b < a ? -1 : 1)
}

var myArray = [28, 92, 12, 12, 2];
myArray.sort(mySorting);

var ranks = $.grep(myArray, function(item, idx) {
    return item != myArray[idx - 1];
}).reverse();



$.each(myArray, function(idx, item) {
    var rank= $.inArray( item, ranks)+1;
    $('body').append('Rank of '+item+ ' is '+ rank+'<br>')

})​

私の問題は、配列を次のように変更したときです。

var myArray = [["textA",28], ["textB",92], ["textC",12], ["textD",12], ["textE",2]];

並べ替え機能が機能しなくなりました。誰かが私を助けたり、正しい方向に向けたりできますか?ネストされた各要素の数値に基づいて「myArray」を並べ替えたいと思います。

よろしくお願いします。

4

1 に答える 1

0

並べ替え関数に渡される引数は、並べ替えられる配列に含まれるものです。新しい配列には 2 要素の配列が含まれているため、配列を並べ替えたときに並べ替え関数が受け取るのはこの配列です。

2 要素の配列を 2 番目の要素に従って並べ替えたいとします。そのためには、並べ替え関数を次のように変更する必要があります。

function mySorting(a, b) {
    return a[1] == b[1] ? 0 : (b[1] < a[1] ? -1 : 1)
}

編集:同じ 2 番目の要素を持つすべての配列に同じランクを割り当てたい場合は、残りのコードを変更して、配列を比較するときに 2 番目の要素のみを考慮する必要があります。実際には、並べ替えをそのままにしておくのがおそらく最も簡単ですが、配列をランク付けする前に 2 番目の要素以外をすべて破棄します。

function toSortKey(item) {
    return item[1];
}

function mySorting(a, b) {
    return a == b ? 0 : ( b < a ? -1 : 1 );
}

var myArray = [["textA",28], ["textB",92], ["textC",12], ["textD",12], ["textE",2]];

var sortKeys = $.map(myArray, toSortKey);
sortKeys.sort(mySorting);

var ranks = $.grep(sortKeys, function(item, idx) {
    return item != sortKeys[idx - 1];
}).reverse();

$.each(myArray, function(idx, item) {
    var rank = $.inArray( toSortKey(item), ranks ) + 1;
    $('body').append('Rank of ' + item + ' is ' + rank + '<br>')
})​;
于 2012-11-05T21:18:28.820 に答える