按字母顺序对数组进行排序?

6

我需要按字母顺序对数组进行排序。我尝试了javascript的sort()方法,但它不起作用,因为我的数组包含数字、小写字母和大写字母。有人能帮我解决这个问题吗?谢谢。

例如,我的数组是:

[
    "@Basil",
    "@SuperAdmin",
    "@Supreme",
    "@Test10",
    "@Test3",
    "@Test4",
    "@Test5",
    "@Test6",
    "@Test7",
    "@Test8",
    "@Test9",
    "@a",
    "@aadfg",
    "@abc",
    "@abc1",
    "@abc2",
    "@abc5",
    "@abcd",
    "@abin",
    "@akrant",
    "@ankur",
    "@arsdarsd",
    "@asdd",
    "@ashaa",
    "@aviral",
    "@ayush.kansal",
    "@chris",
    "@dgji",
    "@dheeraj",
    "@dsfdsf",
    "@dualworld",
    "@errry",
    "@george",
    "@ggh",
    "@gjhggjghj"
]

如果排序的内容中不包含字母和数字,你希望按照哪些“字母表”进行排序?默认的字母表有什么问题?你期望得到什么结果? - Bergi
数组看起来已经排序了... - mishik
4
你的期望输出是什么? - Christoph
@NimChimpsky 虽然这听起来很合理,但只要 OP 没有明确确认,它仍然只是一个猜测... - Christoph
@Christoph:如果字母以“A”或“a”开头,则应该首先列出。在我的情况下,优先级是根据大小写设置的,就像这样: - '@ABC','acd','aed','@Bc','@bella'等。 - Sumodh Nair
显示剩余2条评论
3个回答

7
a.sort(function(a, b) {
    var textA = a.toUpperCase();
    var textB = b.toUpperCase();
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});

这个链接应该可以工作(jsFiddle)


4
function alphabetical(a, b){
     var c = a.toLowerCase();
     var d = b.toLowerCase();
     if (c < d){
        return -1;
     }else if (c > d){
       return  1;
     }else{
       return 0;
     }
}


yourArray.sort(alphabetical);

1

要按应用于元素的键函数(这里是 toUpperCase)对数组进行排序,Schwartzian transform,也称为“装饰-排序-去装饰”,是您的首选技术:

cmp = function(x, y) { return x > y ? 1 : x < y ? -1 : 0 }

sorted = array.map(function(x) {
    return [x.toUpperCase(), x]
}).sort(function(x, y) {
    return cmp(x[0], y[0])
}).map(function(x) {
    return x[1]
})

这种方法的主要优点在于每个元素只调用一次关键函数,当关键函数较重或具有副作用时,这一点很重要。
我知道你现在正在寻求简单的答案,但这可能是你未来考虑学习的事情。

不,它返回的是["a!", "a"],但应该是["a", "a!"]。您需要仅按数组的装饰部分进行排序。 - Bergi
@Bergi:我在问题中没有看到任何["a!", "a"] - georg
当然这不是问题,OP只是发布了一个示例数组。你怎么能确定他的实际数据不包含!"#$%&'()*+中的任何字符? - Bergi
@thg435 嗯,"它在这三个示例值上运行良好"这个论点并不是一个有效的争论立场。虽然我喜欢使用ST的一般方法,因此对于这个概念给予+1。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接