javascript - 如何在javascript中对混合数字/字母数字数组进行排序

标签 javascript jquery angularjs sorting

我有一个混合数组,我需要按数字、字母然后按数字排序-

['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3']

我如何将它排序为:

['1', '2', 'A1', 'A2', 'A3', 'A3A', 'A3B', 'A4', 'A10', 'A11', 'A12', 'B2', 'B10', 'F1', 'F3']

这是我尝试过的:

var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a, b) {
    var AInt = parseInt(a.Field, 10);
    var BInt = parseInt(b.Field, 10);

    if (isNaN(AInt) && isNaN(BInt)) {
        var aA = (a.Field).replace(reA, "");
        var bA = (b.Field).replace(reA, "");
        if (aA === bA) {
            var aN = parseInt((a.Field).replace(reN, ""), 10);
            var bN = parseInt((b.Field).replace(reN, ""), 10);
            return aN === bN ? 0 : aN > bN ? 1 : -1;
        } else {
            return aA > bA ? 1 : -1;
        }
    } else if (isNaN(AInt)) {//A is not an Int
        return 1;//to make alphanumeric sort first return -1 here
    } else if (isNaN(BInt)) {//B is not an Int
        return -1;//to make alphanumeric sort first return 1 here
    } else {
        return AInt > BInt ? 1 : -1;
    }
}

fieldselecteddata.sort(sortAlphaNum);

但这只会按字母/数字对它进行排序,直到 1 个数字和 1 个字符的组合,如 A1A2A10。但是,如果存在像 A3AA3B 这样的值,那么它就无法正确排序。这可以直接使用 JavaScript 或 jQuery 来完成吗?

最佳答案

var arr = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3'];

// regular expression to get the alphabetic and the number parts, if any
var regex = /^([a-z]*)(\d*)/i;

function sortFn(a, b) {
  var _a = a.match(regex);
  var _b = b.match(regex);

  // if the alphabetic part of a is less than that of b => -1
  if (_a[1] < _b[1]) return -1;
  // if the alphabetic part of a is greater than that of b => 1
  if (_a[1] > _b[1]) return 1;

  // if the alphabetic parts are equal, check the number parts
  var _n = parseInt(_a[2]) - parseInt(_b[2]);
  if(_n == 0) // if the number parts are equal start a recursive test on the rest
      return sortFn(a.substr(_a[0].length), b.substr(_b[0].length));
  // else, just sort using the numbers parts
  return _n;
}

console.log(arr.sort(sortFn));

注意正则表达式中的i修饰符(/.../i)表示不区分大小写(同时查找小写和大写)。

关于javascript - 如何在javascript中对混合数字/字母数字数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41972652/

相关文章:

javascript - 如何使用 jquery 或 javascript 插入附加文本

javascript - 换行字符串

javascript - 获取简单 GET 请求的 NS_BINDING_ABORTED 错误

jquery - KnockoutJS 绑定(bind)到可观察数组中的单个对象

javascript - 为什么输入框不在背景图片之上?

javascript - 需要加载更多按钮以将所有元素向下移动页面

javascript - 复选框值的总和

javascript - 如果范围变量作为参数传递,如何正确更新它

javascript - Angular 翻译与 ng-i18next

angularjs - Karma 中始终正确的测试失败 - 为什么?