Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript对十进制数字进行正确排序_Javascript_Sorting - Fatal编程技术网

javascript对十进制数字进行正确排序

javascript对十进制数字进行正确排序,javascript,sorting,Javascript,Sorting,好的,我有一段代码,按字母顺序对名字进行排序 然而,代码没有按照我想要的方式处理小数 它以以下方式对名称进行排序(Obv我希望它以数字递增): 它将命令: 苹果-1.0051 苹果-1.1071 苹果-11.1592 苹果-12.0692 苹果-12.1717 苹果-2.0186试试下面的代码: function (x, y) { x=x.myname; y=y.myname; var nameA = x.toLowerCase().split("-")[0],

好的,我有一段代码,按字母顺序对名字进行排序

然而,代码没有按照我想要的方式处理小数

它以以下方式对名称进行排序(Obv我希望它以数字递增):

它将命令:

  • 苹果-1.0051
  • 苹果-1.1071
  • 苹果-11.1592
  • 苹果-12.0692
  • 苹果-12.1717
  • 苹果-2.0186试试下面的代码:

    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;
    }
    
    函数(x,y){
    x=x.myname;
    y=y.myname;
    var nameA=x.toLowerCase().split(“-”[0],
    nameB=y.toLowerCase().split(“-”[0]
    if(nameAnameB)返回1
    var浮动提取=/([1-9][0-9]*\.?[0-9]*)(\.[0-9]+)([Ee][+-]?[0-9]+)?/;
    if(浮动提取试验(x)和浮动提取试验(y)){
    x=x.match(flootextract)[1];
    y=y.match(flootextract)[1];
    如果(!isNaN(parseFloat(x))和&!isNaN(parseFloat(y))){
    x=parseInt(x);
    y=parseInt(y);
    }
    回报率((x>y)?1:((x
    它拆分字符串,并与第一部分[在连字符之前]进行简单比较,然后搜索字符串内部的浮点,并在列表中对其进行另一种排序


    |

    就像@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;
        }
    
    功能(a、b){
    变量部分,textPartA,textPartB,numericPartA,numericPartB;
    部分=a.分割('-');
    textPartA=零件[0];
    numericPartA=parseFloat(parts[1]);
    部分=b.分割('-');
    textPartB=零件[0];
    numericPartB=parseFloat(parts[1]);
    //先按文本排序
    如果(textPartAtextPartB){
    返回1;
    }
    //文本部分相等,现在按数字部分排序
    如果(数字部分A<数字部分B){
    返回-1;
    }
    如果(数字零件A>数字零件B){
    返回1;
    }
    返回0;
    }
    
    @乔尼:

    以下是来源+小解释:

    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值进行排序——否则,它将首先根据字符串值进行排序

    Ok我使用了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
    

    }另一页上有一个类似的解决方案:


    其思想是先按字符串排序,然后按数字排序。

    现在您正在按文本字符串排序(ascii排序)。您可以在数字:01.0001上放置前导零,或者必须将数字从字符串中拆分出来,转换它们,然后按两个字段进行排序。这似乎只按数字部分进行排序:SUpdated answer,是否需要*.myname作为要排序的字符串?好的,我已经尝试了此代码,但它仍然以相同的方式对其进行排序。*.myname是要排序的字符串,格式为“Apple-1.0051”等ok I get和error“match(…).1为空或不是包含匹配检测的objectUpdated答案。我似乎无法使此代码正常工作:S您能提供演示吗?感谢您迄今为止的帮助。添加了一个示例。您能否向我提供一些详细信息,以说明您“似乎无法使此代码正常工作”的原因。“你有错误吗?意外结果?我收到一个错误,说对象不支持此属性或方法。啊,我想我现在看到了。函数变量
    a
    b
    不是字符串,而是对象。拆分部分应该写为:
    a.myname.split('-')
    而不是
    a.split('-')
    。我通过将其稍微更改为以下内容来实现这一点:
    code
    函数(a,b){var parts={a:a.myname.split('-'),b:b.myname.split('-')};if(parts.a[0]==parts.b[0])//字符串是相同的返回parseFloat(parts.a[1])-parseFloat(parts.b[1]);//按数字排序返回parts.a[0]>parts.b[0]?1:-1;//按字符串排序}
    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