Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Arrays_Sorting - Fatal编程技术网

数组在javascript中排序不正确

数组在javascript中排序不正确,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个Javascript字符串数组,我正在使用compareFunction对其进行排序。在大多数情况下,它的排序是正确的: JS array = ["E10N1", "E10N3", "E10N10", "E10N2", "E10N4", "E10N9", "E10N5", "E10N8", "E10N6", "E10N7"]; function sortStrings(a, b){ if(a < b){ return -1; } if(a

我有一个Javascript字符串数组,我正在使用
compareFunction
对其进行排序。在大多数情况下,它的排序是正确的:

JS

array = ["E10N1", "E10N3", "E10N10", "E10N2", "E10N4", "E10N9", "E10N5", "E10N8", "E10N6", "E10N7"];

function sortStrings(a, b){
    if(a < b){
        return -1;
    }
    if(a > b){
        return 1;
    }
    return 0;
}

array.sort(sortStrings);
for(var i = 0; i < array.length; i++){
    $(".table_body").append("<div class='table_row'><p>" +array[i] +"</p></div>");
}
阵列=[“E10N1”、“E10N3”、“E10N10”、“E10N2”、“E10N4”、“E10N9”、“E10N5”、“E10N8”、“E10N6”、“E10N7”];
函数排序字符串(a,b){
if(ab){
返回1;
}
返回0;
}
array.sort(sortStrings);
对于(var i=0;i”);
}
我遇到的问题是排序函数将
“E10N10”
项放在
“E10N1”
“E10N2”
项之间。看起来是这样的:


我知道字符串的排序是按字母顺序进行的,但是
“E10N10”
字符串的处理是否仍然会晚于
“E10N9”
?如何修复它,使该特定字符串在排序后在数组中位于最后一位?

在字母排序中,它只按顺序查看字符,因此“E10N1”将位于“E10N9”之前,即使“E10N1”之后还有另一个字符。就像“abcd”在“abd”之前一样

如果您真的需要所要求的排序类型,则需要更复杂的自定义排序算法,该算法实际解析标记的数字部分,以对它们进行实际的数字比较(而不是字母排序)

下面是一个基于尾随数字排序的排序方案:

var数组=[“E10N1”、“E10N3”、“E10N10”、“E10N2”、“E10N4”、“E10N9”、“E10N5”、“E10N8”、“E10N6”、“E10N7”];
var regex=/\d+$/;
函数getLastNum(str){
var m=str.match(regex);
如果(m){
返回parseInt(m[0],10);
}否则{
返回-1;
}
}
array.sort(函数(a,b){
返回getLastNum(a)-getLastNum(b);
});

document.write(JSON.stringify(数组))小于9,因此
“E10N10”
小于
“E10N9”
。要获得所需的结果,需要按值顺序对数字进行排序,同时按ASCII顺序对非数字进行排序。您可以使用以下Alphanum算法:


您可以修改自定义排序功能来处理此问题。例如,如果所有字符串都以排序时不关心的4个字符开头,请执行以下操作:

function sortStrings(a, b){

    a = parseInt(a.substr(4));
    b = parseInt(b.substr(4));

    if(a < b){
        return -1;
    }
    if(a > b){
        return 1;
    }
    return 0;
}
函数排序字符串(a,b){
a=parseInt(a.substr(4));
b=parseInt(b.substr(4));
if(ab){
返回1;
}
返回0;
}

您可以使用正则表达式捕获每个元素末尾的数字,并对这些数字进行排序:

function sortStrings(a, b) {
    var regex = /E10N([\d]+)/;
    var apost = +a.match(regex)[1];
    var bpost = +b.match(regex)[1];
    if (apost < bpost) return -1;
    if (apost > bpost) return 1;
    return 0;
}
函数排序字符串(a,b){
var regex=/E10N([\d]+)/;
var-apost=+a.match(regex)[1];
var bpost=+b.match(regex)[1];
if(apostbpost)返回1;
返回0;
}

我建议为这个特殊目的使用一种排序模式

var数据=[“E10N1”、“E10N3”、“E10N10”、“E10N2”、“E10N4”、“E10N9”、“E10N5”、“E10N8”、“E10N6”、“E10N7”],
结果=data.map(函数(el,i){
变量a=/(\D*)(\D*)(\D*)(\D*)(\D*)/i.exec(el);
a、 移位();
返回{index:i,value:a};
}).排序(功能(a、b){
var i=0,r=0;
而(r==0&&idocument.write(“”+JSON.stringify(结果,0,4)+“”)“10”在“1”之后而不是“2”,就像“ab”在“a”之后而不是在“b”之后一样。正如我所说的,@jacknagel可能是重复的,我明白,我该如何修复它?您需要的是自然排序。您可以在这里查看一下:添加了一个通用排序算法,该算法可以处理数字中任意位置的多个数字序列,并对它们进行适当的比较。