【问题标题】:Sort Alphanumeric String Descending对字母数字字符串进行降序排序
【发布时间】:2013-06-05 16:03:06
【问题描述】:

我需要对一组字母数字项进行如下排序。来自:

2 xxx
20 axxx
38 xxxx
20 bx
8540 xxxxxx

到:

8540 xxxxx
38 xxxx
20 axxx
20 bx
2 xxx

因此,按照数字降序排序,然后按字母升序排序。数字始终与字母字符(表示为“xxxx”)用一个空格分隔,但数字是可变长度的。

我怀疑我需要在 sort() 函数中使用一些正则表达式并按空格分隔数字然后对其进行排序,但我不知道如何配合字母排序。任何代码示例?非常感谢!

【问题讨论】:

标签: javascript regex arrays sorting


【解决方案1】:

不需要正则表达式,因为Array.sort() 接受自定义函数:

http://jsfiddle.net/EFGK9/

var arr=["2 xxx","20 axxx","38 xxxx","20 bx","8540 xxxxxx"];
arr.sort(function(a,b){
    a=a.split(" ");
    b=b.split(" ");
    var an=parseInt(a[0],10);
    var bn=parseInt(b[0],10);
    return an<bn?1:(an>bn?-1:(a[1]<b[1]?-1:(a[1]>b[1]?1:0)));
});
console.log(arr);

【讨论】:

  • OP知道.sort()接受自定义函数;他们想知道在该函数中使用正则表达式(尽管正如您所指出的,.split() 在这种情况下就足够了,更复杂的输入格式可能需要正则表达式)。
【解决方案2】:

这样的事情会起作用:

var arr = [
    "2 xxx",
    "20 axxx",
    "38 xxxx",
    "20 bx",
    "8540 xxxxxx"
    ];

arr.sort(function(a, b) {
    var aParts = a.split(" "),
        bParts = b.split(" "),
        aNum = +aParts[0],   // convert numeric parts
        bNum = +bParts[0];   // to actual numbers

    if (aNum > bNum)
        return -1;
    else if (aNum < bNum)
        return 1;
    else
        return aParts[1].localeCompare(bParts[1]);
});

演示:http://jsfiddle.net/KLa2J/

【讨论】:

  • 顺便说一句,jsfiddle 并没有为我工作。我知道这在理论上应该如何工作,但是 split(" ") 函数似乎有问题。无论如何感谢您的好答案!
  • 当您接受的答案使用相同的技术时,我看不出.split(" ") 会给您带来什么问题。您不是在尝试使用旧版本的 IE 来测试小提琴吗?我包含了一个 console.log() 语句,如果当时控制台实际上没有打开,它会在旧 IE 中给出错误,否则它可以正常工作。
  • 啊,我明白了。 jsfiddle 在最新版本的 Chrome 中对我不起作用
  • 很奇怪。我正在使用最新的 Chrome(在 Windows 下)。哦,好吧。
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 2017-01-09
  • 2021-09-19
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多