我想像这样排序数组:
["AAAA1", "AAAA3", "ABAA2", "AAAA10", "AAAA100", "BBB2", "BBB10", "BBAA3", "BBB2AA"]
当我对它进行排序时,请回复我:
["AAAA1", "AAAA10", "AAAA100", "AAAA3", "ABAA2", "BBAA3", "BBB10", "BBB2", "BBB2AA"]
我喜欢这样排序:
["AAAA1", "AAAA3", "AAAA10", "AAAA100", "ABAA2", "BBAA3", "BBB2", "BBB2AA", "BBB10"]
所以我在stackoverflow中搜索它,我发现像链接下的所有东西,但所有这些都没有排序字符的一般方法&数字字符串,仅适用于特殊问题!!
javascript: sort an array a certain way with integers and characters
How to sort number in javascript sort method
How to sort an array of integers correctly
EDIT1:
请检查Sort JavaScript String Array containing numbers中问题的答案,答案适用于格式为var regex = /Value\s([0-9]+)/;
的文本和/或Sort mixed alpha/numeric array,答案仅适用于字符串开头的一个字符。我需要一些方法适用于包含字符和数字的所有可能的字符串...... !!
EDIT2:
Tanx Felix Kling:
我很抱歉,我在示例中排序错误,所以我喜欢在BBB10之前订购BBB2AA
我找到了添加前导零的一般方法,我现在写了一个版本并请优化它或给我另外的选项进行排序http://jsfiddle.net/Qd8nd/
答案 0 :(得分:1)
您似乎对数字的处理方式不同,具体取决于它们在字符串中的显示位置。如果它们在字符之间,它们似乎应该按字母顺序进行比较,如果它们出现在最后,则应在数字上进行比较。如果我错了,请纠正我,否则我无法解释为什么BBB10
出现在BBB2AA
之前。
这种问题没有“一般方法”。您必须实现逻辑以自己比较值。即你必须在其字符串和数字部分中拆分每个值并单独比较这些部分:
function parseValue(v) {
// extract number (defaults to 0 if not present)
var n = +(v.match(/\d+$/) || [0])[0];
var str = v.replace(n, ''); // extract string part
return [str, n];
}
您可以在.sort
callback:
arr.sort(function(a, b) {
a = parseValue(a);
b = parseValue(b);
// compare string part alphabetically
var result = a[0].localeCompare(b[0]);
// if the string part is the same, compare the number part
return result === 0 ? a[1] - b[1] : result;
});