2

わかりました。アルファベット順に付けられた名前を並べ替えるコードのセクションがあります。

ただし、コードは私が望むように小数を処理しません。

それは次の方法で名前を並べ替えます(Obv私はむしろそれが数値的に増加したいです):

それはそれを注文します:

  • アップル-1.0051
  • アップル-1.1071
  • アップル-11.1592
  • アップル-12.0692
  • アップル-12.1717
  • APPLE-2.0186<<これは明らかに「APPLE-1.1071」の後にあるはずです
  • アップル-21.1407
  • アップル-22.089
  • アップル-23.069
  • バナナ-1.0051
  • バナナ-1.1071
  • バナナ-11.1592
  • バナナ-12.0692
  • バナナ-12.1717
  • BANANA-2.0186<<これは明らかに"BANANA-1.1071"の後にあるはずです
  • バナナ-21.1407
  • バナナ-22.089
  • バナナ-23.069

これが私が使用しているコードです。私が使用しているスニペットであるため、コードを完全には理解していません。

function(a, b){
         var nameA=a.myname.toLowerCase(), nameB=b.myname.toLowerCase()
         if (nameA < nameB) //sort string ascending
          return -1 
         if (nameA > nameB)
          return 1
         return 0 //default return value (no sorting)
    }

よろしく、ジョニー

4

5 に答える 5

3

デモ とここにソース+小さな説明があります:

function fruit_sort(a, b) {
    var parts = {
        a: a.split('-'),
        b: b.split('-')
    };
    if (parts.a[0] == parts.b[0]) // strings are the same
        return parseFloat(parts.a[1]) - parseFloat(parts.b[1]); // sort by number
    return parts.a[0] > parts.b[0] ? 1 : -1; // sort by string
}
var arr = ["APPLE - 1.0051",
    "APPLE - 1.1071",
    "APPLE - 11.1592",
    "APPLE - 12.0692",
    "BANANA - 1.0051",
    "BANANA - 1.1071",
    "BANANA - 11.1592",
    "BANANA - 12.0692",
    "BANANA - 12.1717",
    "APPLE - 12.1717",
    "APPLE - 2.0186",
    "APPLE - 21.1407",
    "BANANA - 23.069",
    "APPLE - 22.089",
    "APPLE - 23.069",
    "BANANA - 2.0186",
    "BANANA - 21.1407",
    "BANANA - 22.089"];
arr.sort(fruit_sort);
console.log(arr);
// outputs
[
    "APPLE - 1.0051",
    "APPLE - 1.1071",
    "APPLE - 2.0186",
    "APPLE - 11.1592",
    "APPLE - 12.0692",
    "APPLE - 12.1717",
    "APPLE - 21.1407",
    "APPLE - 22.089",
    "APPLE - 23.069",
    "BANANA - 1.0051",
    "BANANA - 1.1071",
    "BANANA - 2.0186",
    "BANANA - 11.1592",
    "BANANA - 12.0692",
    "BANANA - 12.1717",
    "BANANA - 21.1407",
    "BANANA - 22.089",
    "BANANA - 23.069"
]

最初に、関数は用語をテキストと数値部分に分割します-テキストが偶数の場合は数値のparseFloat値でのみソートされます-それ以外の場合は、最初に文字列値でソートされます。

于 2013-01-26T20:23:30.007 に答える
2

このコードを試してください:

function (x, y) {
    x=x.myname;
    y=y.myname;

    var nameA = x.toLowerCase().split("-")[0],
        nameB = y.toLowerCase().split("-")[0]
    if (nameA < nameB) //sort string ascending
    return -1
    if (nameA > nameB) return 1
    var floatExtract = /(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)?/;
    if (floatExtract.test(x) && floatExtract.test(y)) {
        x = x.match(floatExtract)[1];
        y = y.match(floatExtract)[1];
        if (!isNaN(parseFloat(x)) && !isNaN(parseFloat(y))) {
            x = parseInt(x);
            y = parseInt(y);
        }
        return ((x > y) ? 1 : ((x < y) ? -1 : 0));
    }
    return 0;
}

文字列を分割し、[ハイフンの前の]最初の部分と簡単に比較してから、文字列内のfloatを検索し、それに対してリストで別の並べ替えを行います...

デモ| ソース

于 2013-01-26T19:12:25.633 に答える
2

@Steve Wellensが彼のコメントで提案したように、最初にテキスト部分を比較するように既存のスニペットを変更し、次に同点の場合は、文字列の数値部分をfloatsに変換して比較します。文字列の数値部分のみで並べ替える場合は、@extramasterの回答が役立ちます。

function(a, b){
        var parts, textPartA, textPartB, numericPartA, numericPartB;

        parts = a.split('-');
        textPartA = parts[0];
        numericPartA = parseFloat(parts[1]);

        parts = b.split('-');
        textPartB = parts[0];
        numericPartB = parseFloat(parts[1]);

        //sort by text first
        if(textPartA < textPartB) {
            return -1;
        }
        if(textPartA > textPartB) {
            return 1;
        }

        //text parts are equal, now sort by the numeric parts
        if(numericPartA < numericPartB){
            return -1;
        }
        if(numericPartA > numericPartB){
            return 1;
        }

        return 0;
    }

@ジョニー:簡単な例

于 2013-01-26T19:34:17.927 に答える
1

別のページの同様の解決策は次のとおりです 。JavascriptがDECIMAL番号を正しくソートしない

アイデアは、最初に文字列でソートし、次に数値でソートすることです。

于 2016-11-30T09:53:19.947 に答える
0

わかりました。rlemonのコードサンプルを使用して、次のように編集しました。

function(a, b) {
var parts = {
    a: a.myname.split(' - '),
    b: b.myname.split(' - ')
};
if (parts.a[0] == parts.b[0]) // strings are the same
    return parseFloat(parts.a[1]) - parseFloat(parts.b[1]); // sort by number
return parts.a[0] > parts.b[0] ? 1 : -1; // sort by string

}

于 2013-01-26T20:47:08.070 に答える