如何用javascript中的字符和数字以某种方式对数组进行排序?

时间:2013-08-03 09:44:16

标签: javascript sorting

我想像这样排序数组:

["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/

1 个答案:

答案 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;
});