「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 数値を含む文字列を含む配列を自然な順序で並べ替えるにはどうすればよいですか?

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

2024 年 12 月 23 日に公開
ブラウズ:869

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(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
    b.replace(/(\d )|(\D )/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });
    
    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>"   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"
]
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3