javascript正确排序十进制数

时间:2013-01-26 18:51:52

标签: javascript sorting

好的我有一段代码可以按字母顺序排列名称。

但是代码不会按照我想要的方式处理小数。

它按以下方式命令名称(Obv我宁愿用数字递增):

它会命令它:

  • APPLE - 1.0051
  • APPLE - 1.1071
  • APPLE - 11.1592
  • APPLE - 12.0692
  • APPLE - 12.1717
  • APPLE - 2.0186<<这应该是在“APPLE - 1.1071”之后明显
  • APPLE - 21.1407
  • APPLE - 22.089
  • APPLE - 23.069
  • BANANA - 1.0051
  • BANANA - 1.1071
  • BANANA - 11.1592
  • BANANA - 12.0692
  • BANANA - 12.1717
  • BANANA - 2.0186<<这应该是在“BANANA - 1.1071”之后明显
  • BANANA - 21.1407
  • BANANA - 22.089
  • BANANA - 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)
    }

此致 强尼

5 个答案:

答案 0 :(得分:3)

Demo这里是源+小解释:

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值进行排序 - 否则它首先按字符串值排序。

答案 1 :(得分: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;
}

它会拆分你的字符串并与第一部分[连字符之前]进行简单的比较,然后在你的字符串中搜索一个浮点数,并在列表中对其进行另一种排序......

Demo | Source

答案 2 :(得分:2)

就像@Steve Wellens在评论中建议的那样,我修改了你现有的片段,首先比较文本部分,然后在比较字符串的数字部分时将它们转换为float s。如果你想用字符串的数字部分单独排序,那么@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;
    }

@Jonny:A quick example

答案 3 :(得分:1)

以下是另一个页面上的类似解决方案: Javascript not sorting DECIMAL numbers correctly

我们的想法是首先按字符串排序然后按数字排序。

答案 4 :(得分: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

}