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
相关产品推荐
相关产品推荐

