3

既に並べ替えられた配列 (最大 1,000 項目を含むことができます) を持っています。指定された文字で始まる項目のブロックを取り、それらを一番上に移動したいだけです。

// Before sort
{ "alpha", "beta", "delta", "delta frequency", "gamma", "theta" } 

// After sort with "d" as the specified letter
{ "delta", "delta frequency", "alpha", "beta", "gamma", "theta" }

私はこれを行う良い方法を知るほど JavaScript に精通していません。私が最初に考えたのは、各項目を反復処理し、指定された開始文字のインデックスが「0」であるかどうかを確認して、最初と最後の配列インデックスを見つけ、その範囲を配列の先頭に移動することでしたが、それはそうかもしれません無駄。より良い方法はありますか?

4

3 に答える 3

1

ここにオプションがあります:

function sortWithPriority(arr, letter) {
    var numFound = 0,
        i = arr.length,
        cur;
    while (i-- > numFound) {
        cur = arr[i];
        if (cur.charAt(0).toLowerCase() === letter.toLowerCase()) {
            arr.unshift(arr.splice(i, 1)[0]);
            numFound++;
            i++;
        }
    }
}

デモ: http://jsfiddle.net/kU8wK/

指定された文字で始まる項目を削除し、配列の先頭に移動します。したがって、配列はその場で変更されます。

アイテムの先頭に必要な文字列 (文字だけでなく) を渡すことができるように、簡単に変更できます。

アップデート:

パフォーマンスに関しては、この質問の現在の回答に関しては、この方法が最速のようです。

これが私が行ったパフォーマンステストです: http://jsperf.com/sort-with-letter-priority

数百の項目をアルファベット順に並べた配列を使用します (10 程度よりも優れたテスト ケース)。配列を生成する最良の方法ではないかもしれませんが、それは正しく行われ、その部分はとにかく実際のタイミングとは無関係です (タイミングの外で実行されます)。

私の関数は を使用しないように変更されているtoLowerCaseため、最初の文字と対象の文字を比較するときにすべての関数が「等しい」必要があることに注意してください。もちろん、より正確にしたい場合は、配列内の項目の最初の文字が大文字になる可能性がある場合 (または大文字を渡す場合)、両方toLowerCaseを使用して取得する必要があります。正確な比較。パフォーマンス テストでは、すべてのテスト ケースでその可能性を除外しました。

于 2013-04-12T17:36:05.987 に答える