You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JScript环境下含字母数字的二维数组自定义排序实现咨询

JScript二维数组自定义排序解决方案

问题原因

原有代码存在两处逻辑缺陷:

  • 仅比较了编号的首个字符,未对完整编号按-分割后的分段做顺序比较
  • 纯数字开头的编号未做数值化的分段对比,无法正确排序同前缀的编号

方案1:修正后的Array.sort实现(兼容原生JScript环境)

arr.sort(function(a, b) {
  // 取两个元素的第一个字段作为排序依据
  var codeA = a[0];
  var codeB = b[0];
  // 先判断是否含字母:纯数字开头的排前面,含字母的排后面
  var hasLetterA = /[A-Za-z]/.test(codeA);
  var hasLetterB = /[A-Za-z]/.test(codeB);
  if (hasLetterA !== hasLetterB) {
    return hasLetterA - hasLetterB;
  }
  // 同类型的按`-`分割后逐段比较
  var partsA = codeA.split('-');
  var partsB = codeB.split('-');
  for (var i = 0; i < Math.min(partsA.length, partsB.length); i++) {
    var partA = partsA[i];
    var partB = partsB[i];
    // 都是数字的话按数值比,否则按字符编码比
    var numA = parseInt(partA, 10);
    var numB = parseInt(partB, 10);
    if (!isNaN(numA) && !isNaN(numB)) {
      if (numA !== numB) {
        return numA - numB;
      }
    } else {
      var charDiff = partA.localeCompare(partB);
      if (charDiff !== 0) {
        return charDiff;
      }
    }
  }
  // 所有段都相同的话按长度比较
  return partsA.length - partsB.length;
});
// 输出验证
for(var i=0;i<arr.length;i++){
  WScript.Echo(arr[i][0] + ', ' + arr[i][1]);
}

方案2:简单循环实现冒泡排序(无需依赖Array.sort实现)

var len = arr.length;
// 外层循环控制排序轮数
for (var i = 0; i < len - 1; i++) {
  // 内层循环控制每轮比较次数
  for (var j = 0; j < len - 1 - i; j++) {
    var a = arr[j];
    var b = arr[j + 1];
    var codeA = a[0];
    var codeB = b[0];
    var needSwap = false;
    
    var hasLetterA = /[A-Za-z]/.test(codeA);
    var hasLetterB = /[A-Za-z]/.test(codeB);
    
    if (hasLetterA !== hasLetterB) {
      needSwap = hasLetterA > hasLetterB;
    } else {
      var partsA = codeA.split('-');
      var partsB = codeB.split('-');
      for (var k = 0; k < Math.min(partsA.length, partsB.length); k++) {
        var numA = parseInt(partsA[k],10);
        var numB = parseInt(partsB[k],10);
        if(!isNaN(numA) && !isNaN(numB)){
          if(numA !== numB){
            needSwap = numA > numB;
            break;
          }
        }else{
          var diff = partsA[k].localeCompare(partsB[k]);
          if(diff !== 0){
            needSwap = diff > 0;
            break;
          }
        }
      }
      if(!needSwap){
        needSwap = partsA.length > partsB.length;
      }
    }
    // 满足交换条件则交换两个元素位置
    if (needSwap) {
      var temp = arr[j];
      arr[j] = arr[j + 1];
      arr[j + 1] = temp;
    }
  }
}

两种方案运行后均可得到预期排序结果。

内容的提问来源于stack exchange,提问作者Rob98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 07:54:05