Javascript对数组排序

Javascript对数组排序,javascript,arrays,selection,Javascript,Arrays,Selection,我正在尝试对一个选择选项进行排序,其值和文本如下。 文本可以有特殊字符,需要进行排序。 然而,我发现,字母表后面有一些特殊字符。 我首先要所有特殊字符,然后是字母表 c = [["#test","#test"], ["?test", "?test"], ["test", "test"], ["TEst", "TEst"], ["]test", "]test"]] >>> c.sort() [["#test", "#test"], ["?test", "?t

我正在尝试对一个选择选项进行排序,其值和文本如下。 文本可以有特殊字符,需要进行排序。 然而,我发现,字母表后面有一些特殊字符。 我首先要所有特殊字符,然后是字母表

c =    [["#test","#test"], ["?test", "?test"], ["test", "test"], ["TEst", "TEst"], ["]test", "]test"]]
    >>> c.sort()
    [["#test", "#test"], ["?test", "?test"], ["TEst", "TEst"], ["]test", "]test"], ["test", "test"]]
问题似乎是“测试”

另一个简单的例子:

cool = ['#new','?new','[new',']new','NEw','&new','cool','ind']
["#new", "?new", "[new", "]new", "NEw", "&new", "cool", "ind"]
cool.sort()
["#new", "&new", "?new", "NEw", "[new", "]new", "cool", "ind"]

可以将比较函数作为
.sort()
函数参数传递,如

c.sort(function(a, b) {
    if (a.charCodeAt(0) <= 49) {
        return -1;
    }

    return a.localeCompare(b);
})
c.sort(函数(a,b){

if(a.charCodeAt(0)可以将比较函数作为
.sort()
函数参数传递,如

c.sort(function(a, b) {
    if (a.charCodeAt(0) <= 49) {
        return -1;
    }

    return a.localeCompare(b);
})
c.sort(函数(a,b){

如果(a.charCodeAt(0),则问题特别是带有的字符,这些字符是标点符号或特殊字符,但代码高于字母字符。因此,排序函数需要考虑这一点

例如,您可以通过将这些字符映射到较低的ASCII字符来实现这一点

函数转换字符串{
var r=“”,
代码;
对于(变量i=0;i如果(code>=91&&code=123&&code=91&&A=123&&A=91&&B=123&&B,则问题特别在于带有的字符,这些字符是标点符号或特殊字符,但代码高于字母字符。因此,排序函数需要考虑这一点

例如,您可以通过将这些字符映射到较低的ASCII字符来实现这一点

函数转换字符串{
var r=“”,
代码;
对于(变量i=0;i如果(示例中的code>=91&&code=123&&code=91&&A=123&&A=91&&B=123&&B与默认排序没有任何区别。我猜当
A
B
都低于ASCII 49时,排序顺序将是不确定的?@Stuart:显然,我给了OP一个如何改进代码以实现所需结果的想法。这是直到OP更改比较函数以满足所有要求。很公平,我只是想检查一下我没有误解您的代码。是的,它给出了默认结果。感谢您的想法。在示例中,这与默认排序没有任何区别。我猜
a
b
都低于ASCII 49排序顺序将是不确定的?@Stuart:显然,我给了OP一个如何改进代码以达到预期结果的想法。由OP来更改比较函数以满足所有要求。很公平,我只是想检查一下,我对您的代码没有误解。是的,它给出了默认结果。谢谢我的建议缉毒局。
function compareTransformedStrings(a, b) {
    if (a == b) return 0;
    for (var i = 0, A, B; (A = a.charCodeAt(i)) && (B = b.charCodeAt(i)); i++) {
        if (A != B) {
            return A - (A >= 91 && A <= 96) * 69 - (A >= 123 && A <= 126) * 95
                < B - (B >= 91 && B <= 96) * 69 - (B >= 123 && B <= 126) * 95 
                ? -1 : 1;
        }
    }
    return a.length < b.length ? -1 : 1;
}
c.sort(function (a, b) {
    return compareTransformedStrings(a[0], b[0]);
});