0

我想像这样对数组进行排序:

["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:使用整数和字符以某种方式对数组进行排序

如何在javascript排序方法中对数字进行排序

如何正确排序整数数组

编辑1:

请检查包含数字的排序 JavaScript 字符串数组中的问题答案,答案适用于格式为 var 的文本,regex = /Value\s([0-9]+)/;或者在排序混合字母/数字数组中,答案仅适用于字符串开头的一个字符。我需要一些方法适用于所有可能包含字符和数字的字符串......!

编辑2:

坦克斯菲利克斯克林:

很抱歉,我在示例中的排列顺序错误,所以我喜欢在 BBB10 之前订购 BBB2AA

我找到了添加前导零的一般方法,我现在写了一个版本,请优化它或给我另一个排序选项,如http://jsfiddle.net/Qd8nd/

4

1 回答 1

2

似乎您对数字的处理方式有所不同,具体取决于它们在字符串中的出现位置。如果它们在字符之间,似乎它们应该按字母顺序进行比较,如果它们出现在末尾,则应该按数字进行比较。如果我错了,请纠正我,否则我无法解释为什么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您可以在回调中使用该函数:

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;
});
于 2013-08-03T09:56:02.877 回答