Javascript 显示以特定格式排列的数组

Javascript 显示以特定格式排列的数组,javascript,arrays,Javascript,Arrays,我有以下JavaScript数组: myArray = ["lu9","lu10","lu11","ma9","ma10","ma11","mi9","mi10","mi11"]; 然后,我需要显示这些值​​(例如在警报中),但必须按照以下方式进行安排: "lu9,ma9,mi9,lu10,ma10,mi10,lu11,ma11,mi11" 我该怎么做呢?我们需要先按数字排序,然后按字母排序。 这里不需要正则表达式 我们将使用填充: so ma11 will be 0011ma and mi

我有以下JavaScript数组:

myArray = ["lu9","lu10","lu11","ma9","ma10","ma11","mi9","mi10","mi11"];
然后,我需要显示这些值​​(例如在警报中),但必须按照以下方式进行安排:

"lu9,ma9,mi9,lu10,ma10,mi10,lu11,ma11,mi11"

我该怎么做呢?

我们需要先按数字排序,然后按字母排序。 这里不需要正则表达式

我们将使用填充:

so ma11 will be 0011ma
and mi11 will be 0011mi
and ma11 will be 0011ma

(and mi9 will be 0009mi , the padding helps 11 to be bigger then 2 as string)
因此,现在对其进行排序将产生正确的结果

var a = ["ma9", "ma10", "ma11", "mi9", "mi10", "mi11", "lu9", "lu10", "lu11"]
a.sort(function (a, b)
{
        return   calc(a) > calc(b);
});

function calc(x)
{
    return ("0000" + x.slice(2)).slice(-4) + x.slice(0,2);
}
结果:

    ["ma9", "ma10", "ma11", "mi9", "mi10", "mi11", "lu9", "lu10", "lu11"]
var myArray=[“lu9”、“lu10”、“lu11”、“ma9”、“ma10”、“ma11”、“mi9”、“mi10”、“mi11”];
var derp=函数(a,b){
a=a.替换(/[^0-9]+/g',a);
b=b.替换(/[^0-9]+//g',,b);
返回a
var myArray=[“lu9”、“lu10”、“lu11”、“ma9”、“ma10”、“ma11”、“mi9”、“mi10”、“mi11”];
函数myResult(myArray){
myArray=myArray.slice().sort(函数(a,b){
var reg=/\d+///用于提取数字部分的正则表达式
var num=2*(+a.match(reg)-+b.match(reg))//在数值上加上2的权重
var str=a>b?1:a

这里有一个

列表中的每个项目都有两部分:前导字符(mi、ma、lu)和数字后缀。要正确排序,我们必须同时考虑这两个因素

array.sort(function sorter (a, b) {
    var re = /^(\D+)(\d+)$/,
        left = re.exec(a),
        right = re.exec(b);

    if (left[1] === right[1]) {
        return Number(left[2]) - Number(right[2]);
    }

    return left[1] < right[1] ? -1 : 1;
});
现在,如果我们的输入是
a=lu9
b=mi4

1. left = ['lu9', 'lu', '9']
2. right = ['mi4', 'mi', '4']
3. left[1] !== right[1]
   1. left[1] < right[1] = true
   2. return -1
1。左=['lu9','lu','9']
2.右=['mi4','mi','4']
3.左[1]!==对[1]
1.左[1]<右[1]=真
2.返回-1

那么你想先按数字排序,然后按字母排序?我想我没有一个完整的解决方案,但要尝试解决这个问题:这种按数字排序的方法并不完全适合大多数字母数字排序,因此你可能需要制作自己的“比较器函数”来划分字母/数字部分,然后根据两者进行比较。它总是一个两个字母的字符串后跟数字,还是可以更改?数字是否会超过0到99的范围?这也适用于您的:那么
var myArray=[“ma11”,“mi11”,“ma11”]
正确的输出不应该是
[ma11,ma11,mi11]
而不是
[“ma11”,“mi11”吗,“ma11”]
?您可以使用表示“非数字”的
\D
代替
[^0-9]
,不需要正则表达式。您可以使用排序功能。用它!这就是为什么它在那里for@RoyiNamir你能详细说明一下吗?我不完全明白你的意思。你使用排序函数,也使用正则表达式。为什么?您只能在不使用正则表达式的情况下使用sort函数。效率很高。请参阅“我的编辑”。@RoyiNamir从字符串中提取数字部分(谁知道它不能是3位或4位后缀),以便能够根据字符串部分对其施加权重。谁在乎性能呢,在这种情况下,可读性是非常重要的,这并不是说OP需要穷尽地运行数百万次。@RoyiNamir No problem=)不要误解我的意思,我不想冒犯别人,我只是希望在20+ks的回答中有更高的质量不需要正则表达式。排序函数可以在不使用正则表达式的情况下完成此操作。你需要先按数字再按字母排序,所以先按数字再按字母排序。我使用的是
array.sort
,这并不意味着regepx不是一个很好的补码。使用它们,可以解决OPs特定场景之外的场景(如果他的前缀从2个字符变为1、4、15怎么办?),在这里,我不按数字再按字母排序——我按字母再按数字排序,这更符合逻辑(因为这是字符串的构建方式)。
array.sort(function sorter (a, b) {
    var re = /^(\D+)(\d+)$/,
        left = re.exec(a),
        right = re.exec(b);

    if (left[1] === right[1]) {
        return Number(left[2]) - Number(right[2]);
    }

    return left[1] < right[1] ? -1 : 1;
});
1. left = ['lu9', 'lu', '9']
2. right = ['lu10', 'lu', '10']
3. left[1] === right[1]
   1. Number(left[2]) = 9
   2. Number(right[2]) = 10
   3. return 9 - 10 (negative number, a before b)
1. left = ['lu9', 'lu', '9']
2. right = ['mi4', 'mi', '4']
3. left[1] !== right[1]
   1. left[1] < right[1] = true
   2. return -1