Javascript 数据列表不能正确排序

Javascript 数据列表不能正确排序,javascript,Javascript,我想对这个记录进行排序,我的输入数组是a1 var a1 = ["ap1","ap10","ap11","ap2","ap3","ap4","ap5","ap6","ap7","ap8","ap9"]; 输出应类似于: ["ap1","ap2","ap3","ap4","ap5","ap6","ap7","ap8","ap9","ap10","ap11"]; 这是密码 var a1 = ["ap1","ap10","ap11","ap2","ap3","ap4","ap5","ap6

我想对这个记录进行排序,我的输入数组是a1

var a1 = ["ap1","ap10","ap11","ap2","ap3","ap4","ap5","ap6","ap7","ap8","ap9"];
输出应类似于:

["ap1","ap2","ap3","ap4","ap5","ap6","ap7","ap8","ap9","ap10","ap11"];
这是密码

    var a1 = ["ap1","ap10","ap11","ap2","ap3","ap4","ap5","ap6","ap7","ap8","ap9"];

    var a2 = a1.sort(function(a,b){
    var charPart = [a.substring(0,1), b.substring(0,1)],
    numPart = [a.substring(1)*1, b.substring(1)*1];

    if(charPart[0] < charPart[1]) return -1;
        else if(charPart[0] > charPart[1]) return 1;
        else{ //(charPart[0] == charPart[1]){
            if(numPart[0] < numPart[1]) return -1;
            else if(numPart[0] > numPart[1]) return 1;
            return 0;
        }
    });

    alert(a2.toString());
var a1=[“ap1”、“ap10”、“ap11”、“ap2”、“ap3”、“ap4”、“ap5”、“ap6”、“ap7”、“ap8”、“ap9”];
变量a2=a1.排序(函数(a,b){
var charPart=[a.子字符串(0,1),b.子字符串(0,1)],
numPart=[a.子字符串(1)*1,b.子字符串(1)*1];
if(charPart[0]charPart[1])返回1;
else{//(charPart[0]==charPart[1]){
if(numPart[0]numPart[1])返回1;
返回0;
}
});
警报(a2.toString());
您似乎忘记了
apN
字符串的字符部分是2字符长:-)对于更通用的解决方案,您可以使用

var charPart = [a.match(/^\D*/)[0], b.match(/^\D*/)[0]],
    numPart = [+a.replace(/^\D*/, ''), +b.replace(/^\D*/, '')];
试试这个:

var a2 = a1.sort(function(a, b) {
   if (a == b) {
      return 0;
   }

   var charParts = [a.replace(/[0-9]/g, ''), b.replace(/[0-9]/g, '')],
       numParts = [parseInt(a.replace(/[^0-9]/g, ''), 10), parseInt(b.replace(/[^0-9]/g, ''), 10)];

   if (charParts[0] != charParts[1]) {
       return charParts[0] > charParts[1] ? 1 : -1;
   }

   return numParts[0] > numParts[1] ? 1 : -1;
});

除了Bergis答案,数字部分中也不需要
if
else
构造。 您可以简单地返回差异

    var a2 = a1.sort(function (a, b) {
        var charPart = [a.match(/^\D*/)[0], b.match(/^\D*/)[0]],
            numPart = [+a.replace(/^\D*/, ''), +b.replace(/^\D*/, '')];
        if (charPart[0] < charPart[1]) return -1;
        if (charPart[0] > charPart[1]) return 1;
        return numPart[0] - numPart[1]
    });
var a2=a1.排序(函数(a,b){
var charPart=[a.match(/^\D*/)[0],b.match(/^\D*/)[0]],
numPart=[+a.replace(/^\D*/,''),+b.replace(/^\D*/,'');
if(charPart[0]charPart[1])返回1;
返回numPart[0]-numPart[1]
});
更新:
var a1=[“a3p1”、“a4p2”、“ap8a1”、“a8p10”、“a4p10”、“ap8a4”、“a8p11”、“a9p2”、“ap3”、“ap4”、“ap5”、“ap6”、“ap7”、“ap8”、“ap9”];
变量a2=a1.排序(函数(a,b){
var_a=a.split(/(\d+/);
var_b=b.split(/(\d+/);
var len=数学最小值(_a.长度,_b.长度);
对于(变量i=0;i_b[i]?1:-1;
}
}
返回值(_a.长度-_b.长度);
});
控制台日志(a2);//[“a3p1”、“a4p2”、“a4p10”、“a8p10”、“a8p11”、“a9p2”、“ap3”、“ap4”、“ap5”、“ap6”、“ap7”、“ap8”、“ap8a1”、“ap8a4”、“ap9”]
以下是一个关于:
这将对数组进行排序,考虑到所有数字部分

对于这个输入数组,它的排序非常完美…变量a1=[“a1”、“A10”、“A11”、“A12”、“A2”、“A3”、“A4”、“B10”、“B2”、“F1”、“F12”、“F3”];但我将输入传递为变量a1=[“ap1”、“ap10”、“ap11”、“ap2”、“ap3”、“ap4”、“ap5”、“ap6”、“ap7”、“ap8”、“ap9”];好的,对于我的输入,应该是什么样的代码,比如var charPart=[a.substring(0,2),b.substring(0,2)],numPart=[a.substring(2)*2,b.substring(2)*2]“
*1
只是将字符串转换为一个数字,不需要更改,但是是的。@Bergi:非常感谢
匹配
子字符串
慢得多。小心!@ant\u Ti:这是真的,但是如果我们在使用正则表达式之前不知道字母的数量。当然,我们可以通过deco来优化它。”如果问题是关于代码高尔夫,我会使用
return(charPart[0]>charPart[1])-(charPart[0]@Bergi我只是想指出,差异的结果已经是If条件,检查并返回。与代码高尔夫无关=)var a1=[“a3p1”,“a4p10”,“a8p11”、“a9p2”、“ap3”、“ap4”、“ap5”、“ap6”、“ap7”、“ap8”、“ap9”];此输入数据排序不正确,请您告诉我solution@Manu更新并更正了答案,但您没有完全弄清楚排序应该如何工作,所以我按照上面的方式进行了操作:var a1=[“a3p1”、“a5p10”、“a8p11”、“ap2”、“ap3”、“ap4”、“ap5”、“ap6”、“ap7”、“ap8”、“ap9”、“ap9”“,“ap9”];输入数据排序不正确…如果我放入一些
var a2 = a1.sort(function(a, b) {
   if (a == b) {
      return 0;
   }

   var charParts = [a.replace(/[0-9]/g, ''), b.replace(/[0-9]/g, '')],
       numParts = [parseInt(a.replace(/[^0-9]/g, ''), 10), parseInt(b.replace(/[^0-9]/g, ''), 10)];

   if (charParts[0] != charParts[1]) {
       return charParts[0] > charParts[1] ? 1 : -1;
   }

   return numParts[0] > numParts[1] ? 1 : -1;
});
    var a2 = a1.sort(function (a, b) {
        var charPart = [a.match(/^\D*/)[0], b.match(/^\D*/)[0]],
            numPart = [+a.replace(/^\D*/, ''), +b.replace(/^\D*/, '')];
        if (charPart[0] < charPart[1]) return -1;
        if (charPart[0] > charPart[1]) return 1;
        return numPart[0] - numPart[1]
    });
var a1 = ["a3p1", "a4p2", "ap8a1", "a8p10", "a4p10", "ap8a4", "a8p11", "a9p2", "ap3", "ap4", "ap5", "ap6", "ap7", "ap8", "ap9"];
var a2 = a1.sort(function (a, b) {
    var _a = a.split(/(\d+)/);
    var _b = b.split(/(\d+)/);
    var len = Math.min(_a.length, _b.length);
    for (var i = 0; i < len - 1; i++) {
        var c = +_a[i],
            d = +_b[i];
        if (c===c) _a[i] = c;
        if (d===d) _b[i] = d;
        if (_a[i] !== _b[i]) {
            return _a[i] > _b[i] ? 1 : -1;
        }
    }
    return (_a.length - _b.length);
});
console.log(a2); //["a3p1", "a4p2", "a4p10", "a8p10", "a8p11", "a9p2", "ap3", "ap4", "ap5", "ap6", "ap7", "ap8", "ap8a1", "ap8a4", "ap9"]