3

JavaScript に次の配列があります。

myArray = ["lu9","lu10","lu11","ma9","ma10","ma11","mi9","mi10","mi11"];

次に、値を (アラートなどで) 表示する必要がありますが、次のように配置する必要があります。

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

どうすればこれを行うことができますか?

4

4 に答える 4

3

リストの各項目には、先頭の文字の寄せ集め (mi、ma、lu) と数字の接尾辞の 2 つの部分があります。適切に並べ替えるには、両方を考慮する必要があります。

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 = lu10

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)

入力がa = lu9andの場合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
于 2013-08-19T15:41:28.927 に答える
2
var myArray = ["lu9","lu10","lu11","ma9","ma10","ma11","mi9","mi10","mi11"];

var derp = function(a, b) {
    a = a.replace(/[^0-9]+/g, '', a);
    b = b.replace(/[^0-9]+/g, '', b);
    return a < b;
}

myArray.sort(derp);
于 2013-08-19T14:38:50.573 に答える
2
var myArray = ["lu9", "lu10", "lu11", "ma9", "ma10", "ma11", "mi9", "mi10", "mi11"];

function myResult(myArray) {
    myArray = myArray.slice().sort(function (a, b) {
        var reg = /\d+/ //A regex to extract the numerical part
        var num = 2 * (+a.match(reg) - +b.match(reg)) //Put a weight of 2 on the numerical value
        var str = a > b ? 1 : a < b ? -1 : 0 //The strings value with a single weight
        return num + str //add them and we have a positive or negative value with a correct weight on the numerical part
    })
    return "" + myArray

}

console.log (myResult(myArray)) //"lu9,ma9,mi9,lu10,ma10,mi10,lu11,ma11,mi11"

ヒアズ・ア・フィドル

于 2013-08-19T14:48:05.990 に答える
2

最初に数字で並べ替え、次に文字で並べ替える必要があります。ここで正規表現は必要ありません。

パディングを使用します。

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"]
于 2013-08-19T14:38:26.403 に答える