JavaScript:对数组进行排序

Roh*_*dal 10 javascript arrays sorting

未排序的数组[输入]:

["> 30 days", "< 7 days", "< 30 days", "< 10 days"];
Run Code Online (Sandbox Code Playgroud)

数组中元素的格式总是如下: </> X days

要求:

上面提到的数组应该根据和排序greater then (>),lesser then symbol (<)并且还要记住天数(应该先减少天数).

预期数组[输出]:

["< 7 days", "< 10 days", "< 30 days", "> 30 days"];
Run Code Online (Sandbox Code Playgroud)

到目前为止尝试过:

我尝试了Array.sort()函数但没有获得预期的输出.

var arr = ["> 30 days", "< 7 days", "< 30 days", "< 10 days"];

var sortedArr = arr.sort();

console.log(sortedArr); // ["< 30 days", "< 10 days", "< 7 days", "> 30 days"]
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 13

您可以按数字排序,如果有比较符号,则获取相同数值的两个偏移的增量,这反映了比较的顺序.

var array = ["> 30 days", "< 7 days", "30 days", "< 10 days", "> 10 days", "< 11 days", "42 days", ">= 42 days", "> 42 days", "<= 42 days", "< 42 days"];

array.sort(function (a, b) {
    function getV(s) {
        return {
            value: s.match(/\d+/),
            offset: { '<': -2, '<=': -1, null: 0, '>=': 1, '>': 2 }[s.match(/[<>]={0,1}(?=\s*\d)/)]
        };
    }
    var aa = getV(a),
        bb = getV(b);

    return aa.value - bb.value || aa.offset - bb.offset;
});

console.log(array);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)


第一/前解决方案

您可以解析字符串并使用它来对数字应用校正值 - 然后进行相应的排序.

{ '>': 0.1, '<': -0.1, null: 0 }[s.match(/[<>](?=\s*\d)/)] + +s.match(/\d+/)
Run Code Online (Sandbox Code Playgroud)

具有修正值的物体

{ '>': 0.1, '<': -0.1, null: 0 }                                    
Run Code Online (Sandbox Code Playgroud)

使用正则表达式获取符号并将其用作对象的键

                                 s.match(/[<>](?=\s*\d)/)
Run Code Online (Sandbox Code Playgroud)

然后添加字符串的数字部分

                                                          + +s.match(/\d+/)
Run Code Online (Sandbox Code Playgroud)

var array = ["> 30 days", "< 7 days", "30 days", "< 10 days"];

array.sort(function (a, b) {
    function getV(s) {
        return { '>': 0.1, '<': -0.1, null: 0 }[s.match(/[<>](?=\s*\d)/)] + +s.match(/\d+/);
    }
    return getV(a) - getV(b);
});

console.log(array);
Run Code Online (Sandbox Code Playgroud)