数値を含む文字列を含む配列を自然な順序で並べ替えるにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-17 19:18:01
オリジナル
471 人が閲覧しました

How to Sort Arrays with Strings Containing Numbers in Natural Order?

自然な配列要素の並べ替え: 数値を含む文字列

この記事では、文字列と数値を組み合わせた要素を含む配列を並べ替えるタスクについて詳しく説明します。自然順序。並べ替えプロセスでは文字列内の数値シーケンスを考慮する必要があります。

問題

次のような配列を考えてみましょう:

["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]
ログイン後にコピー

従来の並べ替え関数を使用してこの配列を並べ替えようとすると、間違った順序になる可能性があります:

["IL0 Foo", "IL10 Baz", "IL3 Bob says hello", "PI0 Bar"]
ログイン後にコピー

解決策: 自然並べ替え

自然な並べ替えを実現するには、次の JavaScript 関数を活用できます。

function naturalCompare(a, b) {
    var ax = [], bx = [];

    a.replace(/(\d+)|(\D+)/g, function(_, , ) { ax.push([ || Infinity,  || ""]) });
    b.replace(/(\d+)|(\D+)/g, function(_, , ) { bx.push([ || Infinity,  || ""]) });
    
    while(ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if(nn) return nn;
    }

    return ax.length - bx.length;
}
ログイン後にコピー

この関数は、入力文字列を数値および非数値の配列にトークン化します。次に、数値を整数として、数値以外の値を文字列として考慮して、配列を辞書順に比較します。

この関数を指定された配列に適用する希望する自然な並べ替え順序になります:

test = [
    "img12.png",
    "img10.png",
    "img2.png",
    "img1.png",
    "img101.png",
    "img101a.png",
    "abc10.jpg",
    "abc10",
    "abc2.jpg",
    "20.jpg",
    "20",
    "abc",
    "abc2",
    ""
];

test.sort(naturalCompare)
document.write("<pre class="brush:php;toolbar:false">" + JSON.stringify(test,0,3));
ログイン後にコピー

これにより、次の並べ替えられた配列が生成されます:

[
  "",
  "abc",
  "abc2",
  "abc10",
  "abc10.jpg",
  "20",
  "20.jpg",
  "img1.png",
  "img2.png",
  "img10.png",
  "img12.png",
  "img101.png",
  "img101a.png"
]
ログイン後にコピー

以上が数値を含む文字列を含む配列を自然な順序で並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート