javascript - 按字母顺序对字符串数组进行排序,然后按数字顺序按特殊字符排序

标签 javascript arrays sorting

给定以下字符串数组,我一直在尝试首先对 a-z 字符串进行自然排序,然后是数字字符串,最后是特殊字符。

    nextSearchTerms = ["T","D","I","C","Y","O","4","K","N","800","S","1","V","(","10","'","`","B","M","[","-"," ","J","U","H","G","R","E","P"];
    console.log(nextSearchTerms);

    Array.prototype.naturalSort = function(){
        var a, b, a1, b1, rx=/(\d+)|(\D+)/g, rd=/\d+/;
        return this.sort(function(as, bs){
            a= String(as).toLowerCase().match(rx);
            b= String(bs).toLowerCase().match(rx);
            while(a.length && b.length){
                a1= a.shift();
                b1= b.shift();
                if (rd.test(a1) || rd.test(b1)){
                    if(!rd.test(a1)) return -1;
                    if(!rd.test(b1)) return 1;
                    if(a1 != b1) return a1-b1;
                }
                else if (a1 != b1) {
                    var aIsLetter = a1[0].charAt(0).match(/[a-z]/i),
                        bIsLetter = b1[0].charAt(0).match(/[a-z]/i);
                    if (aIsLetter && !bIsLetter) return -1;
                    if (!aIsLetter && bIsLetter) return 1;
                    return (a1[0] == b1[0] ? 0 : (a1[0] < b1[0] ? -1 : 1));
                }
            }
            return a.length - b.length;
        });
    }
    console.log(nextSearchTerms.naturalSort());

我一直试图修改的函数当前返回。

[“B”、“C”、“D”、“E”、“G”、“H”、“I”、“J”、“K”、“M”、“N”、“O” ", "P", "R", "S", "T", "U", "V", "Y", "", "'", "(", "-", "[", "`", "1", "4", "10", "800"]

我希望最终的数组输出是。

[“B”、“C”、“D”、“E”、“G”、“H”、“I”、“J”、“K”、“M”、“N”、“O” ", "P", "R", "S", "T", "U", "V", "Y", "1", "4", "10", "800", "'", "(", "-", "[", "`",""]

对我缺少的东西有什么建议吗?

最佳答案

这是我对您正在寻找的东西的刺探。我认为它比你拥有的更干净:

Array.prototype.naturalSort = function() {
  var stringRE = /^[A-Za-z]+$/
  var numberRE = /^[\d]+$/
  return this.sort(function(a, b) {
    var aIsString = stringRE.test(a);
    var bIsString = stringRE.test(b)
    var aIsNumeric = numberRE.test(a);
    var bIsNumeric = numberRE.test(b);
    if (aIsString && bIsString) {
      return a.localeCompare(b);
    } else if (aIsNumeric && bIsNumeric) {
      return parseInt(a, 10) - parseInt(b, 10);
    } else if (aIsString && bIsNumeric) {
      return -1;
    } else if (aIsNumeric && bIsString) {
      return 1;
    } else if (aIsString || aIsNumeric) {
      return -1;
    } else if (bIsString || bIsNumeric) {
      return 1;
    } else {
      return a.localeCompare(b);
    }
  })
};

var chars = ["T","D","I","C","Y","O","4","K","N","800","S","1","V","(","10","'","`","B","M","[","-"," ","J","U","H","G","R","E","P"];

console.log(chars.naturalSort());
// ["B", "C", "D", "E", "G", "H", "I", "J", "K", "M", "N", "O", "P", "R", "S", "T", "U", "V", "Y", "4", "1", "10", "800", " ", "-", "'", "(", "[", "`"]

关于javascript - 按字母顺序对字符串数组进行排序,然后按数字顺序按特殊字符排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36676906/

相关文章:

java - 如何在数组中存储字符串矩阵?

javascript - 按值比较数组中的所有对象

arrays - 按递减或递增顺序按数字字段对数组 Angular 7 进行排序

Bash 排序命令无法正确排序彩色输出

javascript - 有没有办法让一个函数停止所有其他函数?

javascript - browserify 模块中的“this”上下文

javascript - 如何在x秒后自动提交表单?

javascript - 使用 Node 本地化

javascript - 将 PHP 数组转换为项目对象以与 AngularJS 一起使用

arrays - MongoDB:按数组索引排序