我想对一个字符串数组进行排序(在JavaScript中),使得其中数字的组以整数而不是字符串进行比较。我不担心有符号或浮点数。
例如,结果应该是[“a1b3”,“a9b2”,“a10b2”,“a10b11”]而不是[“a1b3”,“a10b11”,“a10b2”,“a9b2”]。
最简单的方法似乎是将每个字符串在数字组周围的边界上拆分。我能否传递一个模式给String.split,以在不删除任何字符的情况下在字符边界上拆分?
“abc11def22ghi”.split(/(\d+)/) = ["abc","11","def","22","ghi"];
还是是否有另一种不涉及拆分字符串的比较字符串的方法,例如通过在所有数字组中添加前导零来使它们具有相同的长度?
"aa1bb" => "aa00000001bb", "aa10bb" => "aa00000010bb"
我正在处理任意字符串,而不是具有特定数字组排列的字符串。
我喜欢Gaby的/(\d+)/一行代码拆分数组。这有多向后兼容? 解析字符串并可以用于重建原始字符串的解决方案比此比较函数更有效。没有答案处理某些字符串以数字开头,而其他字符串不是,但很容易纠正,并且在原始问题中没有明确说明。
我喜欢Gaby的/(\d+)/一行代码拆分数组。这有多向后兼容? 解析字符串并可以用于重建原始字符串的解决方案比此比较函数更有效。没有答案处理某些字符串以数字开头,而其他字符串不是,但很容易纠正,并且在原始问题中没有明确说明。
["a100", "a20", "a3", "a3b", "a3b100", "a3b20", "a3b3", "!!", "~~", "9", "10", "9.5"].sort(function (inA, inB) {
var result = 0;
var a, b, pattern = /(\d+)/;
var as = inA.split(pattern);
var bs = inB.split(pattern);
var index, count = as.length;
if (('' === as[0]) === ('' === bs[0])) {
if (count > bs.length)
count = bs.length;
for (index = 0; index < count && 0 === result; ++index) {
a = as[index]; b = bs[index];
if (index & 1) {
result = a - b;
} else {
result = !(a < b) ? (a > b) ? 1 : 0 : -1;
}
}
if (0 === result)
result = as.length - bs.length;
} else {
result = !(inA < inB) ? (inA > inB) ? 1 : 0 : -1;
}
return result;
}).toString();
结果:"!!,9,9.5,10,a3,a3b,a3b3,a3b20,a3b100,a20,a100,~~"