自然な配列要素の並べ替え: 数値を含む文字列
この記事では、文字列と数値を組み合わせた要素を含む配列を並べ替えるタスクについて詳しく説明します。自然順序。並べ替えプロセスでは文字列内の数値シーケンスを考慮する必要があります。
問題
次のような配列を考えてみましょう:
["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 サイトの他の関連記事を参照してください。