Javascript没有正确排序DECIMAL数字

时间:2013-02-04 09:20:26

标签: javascript arrays sorting

我有一些代码可以按字母顺序排列名称 我遇到的问题是它处理小数的方式 它命令下面的名字(我宁愿用数字增加):

DOG - 1.0510
DOG - 1.1031
DOG - 11.1792
DOG - 12.0920
DOG - 12.1170
DOG - 2.0186 <-- should be after "DOG - 12.117" ???
DOG - 21.4070
DOG - 22.0790
DOG - 23.0390
CAT - 1.0810
CAT - 1.1071
CAT - 11.1592
CAT - 12.0691
CAT - 12.1718
CAT - 2.0186 <-- again should be after "CAT -12.1718" ???
CAT - 21.1403
CAT - 22.081
CAT - 23.069

我在一个对象数组中有名字/值,如下所示:

var array = [
   {
      "myname":"DOG",
      "value":1.0051
   },
   {
      "myname":"DOG",
      "value":1.1071
   }
];

以下是我在网上找到的代码中使用的代码。

function(x, y){
             var xName=x.myname.toLowerCase(), yName=y.myname.toLowerCase()
             if (xName < yName) //string sort ascending
              return -1 
             if (xName < yName)
              return 1
             return 0 //return default value (without sorting)
        }

2 个答案:

答案 0 :(得分:2)

认为问题是你需要按值排序,但你只是按名称排序 下面应该修复它,它按字母顺序排序,然后按数字排序。

代码:

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

答案 1 :(得分:0)

我觉得你差不多了。你只是忘了比较数字:

function(x, y){
    var xName=x.myname.toLowerCase(), yName=y.myname.toLowerCase();
    if (xName < yName){ //string sort ascending
        return -1 
    }else if (xName < yName){
        return 1
    }else if (x.value < y.value){
        return -1;
    }else if (x.value > y.value){
        return 1;
    }else{
        return 0; // Identical keys
    }
}