Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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,我正在尝试对数组进行排序,如下所示: var arr = ["a", "c", "1", "e", "-", "4", "p", "$", "~", "6", "33", "h"]; 我想得到的订单应该是: var arr = ["a", "c", "e", "h", "p", "-", "~", "$", "1", "33", "4", "6"]; 我已经有了一个可行的解决方案,但我不确定这是否是最好(最快)的方法 arr.sort(function(a, b) { return

我正在尝试对数组进行排序,如下所示:

var arr = ["a", "c", "1", "e", "-", "4", "p", "$", "~", "6", "33", "h"];
我想得到的订单应该是:

var arr = ["a", "c", "e", "h", "p", "-", "~", "$", "1", "33", "4", "6"];
我已经有了一个可行的解决方案,但我不确定这是否是最好(最快)的方法

arr.sort(function(a, b) {
    return a.localeCompare(b);
});

for (var i = 0; i < arrLength; i++) {
    if (arr[i].localeCompare("a") >= 0) {
        if (i > 0) {
            Array.prototype.push.apply(arr, arr.splice(0, i));
        }

        break;
    }
}
arr.sort(函数(a,b){
返回a.localeCompare(b);
});
对于(变量i=0;i=0){
如果(i>0){
Array.prototype.push.apply(arr,arr.splice(0,i));
}
打破
}
}

是的,您应该在比较函数中包含逻辑。这比先按一个条件排序,然后按其他一些条件在数组中的各个部分移动更容易理解,并且在其他情况下可以重用

你想要

arr.sort(function(a, b) {
    var aIsAlphabetical = a.localeCompare("a") >= 0,
        bIsAlphabetical = b.localeCompare("a") >= 0;
    if (!aIsAlphabetical && bIsAlphabetical)
        return 1;
    if (aIsAlphabetical && !bIsAlphabetical)
        return -1;
    return a.localeCompare(b);
});
或简称:

arr.sort(function(a, b) {
    return (b.localeCompare("a")>=0)-(a.localeCompare("a")>=0) || a.localeCompare(b);
});

如果您正在寻找最快的代码,您应该使用一个好的示例数组在目标系统上设置基准。

是的,您应该在比较函数中包含逻辑。这比先按一个条件排序,然后按其他一些条件在数组中的各个部分移动更容易理解,并且在其他情况下可以重用

你想要

arr.sort(function(a, b) {
    var aIsAlphabetical = a.localeCompare("a") >= 0,
        bIsAlphabetical = b.localeCompare("a") >= 0;
    if (!aIsAlphabetical && bIsAlphabetical)
        return 1;
    if (aIsAlphabetical && !bIsAlphabetical)
        return -1;
    return a.localeCompare(b);
});
或简称:

arr.sort(function(a, b) {
    return (b.localeCompare("a")>=0)-(a.localeCompare("a")>=0) || a.localeCompare(b);
});

如果您正在寻找最快的代码,您应该使用一个好的示例数组在目标系统上设置基准。

是的,您应该在比较函数中包含逻辑。这比先按一个条件排序,然后按其他一些条件在数组中的各个部分移动更容易理解,并且在其他情况下可以重用

你想要

arr.sort(function(a, b) {
    var aIsAlphabetical = a.localeCompare("a") >= 0,
        bIsAlphabetical = b.localeCompare("a") >= 0;
    if (!aIsAlphabetical && bIsAlphabetical)
        return 1;
    if (aIsAlphabetical && !bIsAlphabetical)
        return -1;
    return a.localeCompare(b);
});
或简称:

arr.sort(function(a, b) {
    return (b.localeCompare("a")>=0)-(a.localeCompare("a")>=0) || a.localeCompare(b);
});

如果您正在寻找最快的代码,您应该使用一个好的示例数组在目标系统上设置基准。

是的,您应该在比较函数中包含逻辑。这比先按一个条件排序,然后按其他一些条件在数组中的各个部分移动更容易理解,并且在其他情况下可以重用

你想要

arr.sort(function(a, b) {
    var aIsAlphabetical = a.localeCompare("a") >= 0,
        bIsAlphabetical = b.localeCompare("a") >= 0;
    if (!aIsAlphabetical && bIsAlphabetical)
        return 1;
    if (aIsAlphabetical && !bIsAlphabetical)
        return -1;
    return a.localeCompare(b);
});
或简称:

arr.sort(function(a, b) {
    return (b.localeCompare("a")>=0)-(a.localeCompare("a")>=0) || a.localeCompare(b);
});


如果你在寻找最快的代码,你应该在目标系统上用一个很好的示例数组设置一个基准。

我认为这个问题最适合代码评审尝试在jsperf.com进行基准测试你只需要一个
排序
回调函数,它返回
-1
0
1
取决于
a
是否应在
b
之前、之后排序。你只需要更新你的比较逻辑来考虑你的特定规则…是否有特殊字符和数字的特定排序标准?或者你只需要在前面排序字母表,其余的东西可以是后面的任何东西。@DhruvPathak我可以试着做一个基准,但我也很好奇是否有其他方法可以做到这一点。编辑:所有字符都应该按
localeCompare
排序我不需要任何“特殊/特定逻辑”我认为这个问题最适合代码审查尝试在jsperf.com进行基准测试您只需要一个
排序
回调函数,它返回
-1
0
1
取决于
a
是否应在
b
之前、之后排序。你只需要更新你的比较逻辑来考虑你的特定规则…是否有特殊字符和数字的特定排序标准?或者你只需要在前面排序字母表,其余的东西可以是后面的任何东西。@DhruvPathak我可以试着做一个基准,但我也很好奇是否有其他方法可以做到这一点。编辑:所有字符都应该按
localeCompare
排序我不需要任何“特殊/特定逻辑”我认为这个问题最适合代码审查尝试在jsperf.com进行基准测试您只需要一个
排序
回调函数,它返回
-1
0
1
取决于
a
是否应在
b
之前、之后排序。你只需要更新你的比较逻辑来考虑你的特定规则…是否有特殊字符和数字的特定排序标准?或者你只需要在前面排序字母表,其余的东西可以是后面的任何东西。@DhruvPathak我可以试着做一个基准,但我也很好奇是否有其他方法可以做到这一点。编辑:所有字符都应该按
localeCompare
排序我不需要任何“特殊/特定逻辑”我认为这个问题最适合代码审查尝试在jsperf.com进行基准测试您只需要一个
排序
回调函数,它返回
-1
0
1
取决于
a
是否应在
b
之前、之后排序。你只需要更新你的比较逻辑来考虑你的特定规则…是否有特殊字符和数字的特定排序标准?或者你只需要在前面排序字母表,其余的东西可以是后面的任何东西。@DhruvPathak我可以试着做一个基准,但我也很好奇是否有其他方法可以做到这一点。编辑:所有字符都应该按
localeCompare
排序。我不需要添加任何“特殊/特定逻辑”,请记住数组是按适当的顺序排序的,所以在运行基准测试时,请确保始终克隆数组。看起来不错,但我在特定平台上进行了基准测试,要对包含1335项的数组进行排序,大约需要1336.75ms(是的,我知道,速度很慢),但对于我上面的版本,需要~502.75毫秒,这是一个很大的区别。要添加,请记住数组是按适当的位置排序的,因此确保在运行基准测试时始终克隆数组。看起来不错,但我在特定平台上进行了基准测试,要对包含1335项的数组进行排序,需要~1336.75毫秒(是的,我知道,速度很慢),但我的版本高于此版本需要~502.75ms,这是一个很大的区别。要添加,请记住数组是按适当的位置排序的,因此确保在运行b时始终克隆数组