JavaScript:对数组进行排序

10

未排序的数组 [输入]:

["> 30 days", "< 7 days", "< 30 days", "< 10 days"];

数组中元素的格式始终为:</> X 天

要求:

按照大于符号(>)小于符号(<)排序,并考虑天数(较少的天数应该排在前面)。

期望的数组[输出]:

["< 7 days", "< 10 days", "< 30 days", "> 30 days"];

目前尝试过的方法:

我尝试使用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"]


1
所以您只需要符号和数字。这个数字总是整数吗? - Nina Scholz
1
@NinaScholz 是的,数字将始终是整数。 - Rohìt Jíndal
> 10 天 是高于还是低于 < 20 天?或者这种情况不存在吗? - deceze
1
> 10 天< 11 天 呢? - deceze
为什么没有人问一个显而易见的问题呢?比如 < 10> 10 呢? - Redu
显示剩余4条评论
3个回答

15
你可以按数字排序,如果有比较符号可用,则取相同数值的delta,并反映出比较的顺序。

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);
.as-console-wrapper { max-height: 100% !important; top: 0; }


第一/旧方案

您可以解析字符串并将其用于向数字应用校正值-然后相应地进行排序。

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

具有修正值的对象

{ '>': 0.1, '<': -0.1, null: 0 }                                    

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

                                 s.match(/[<>](?=\s*\d)/)

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

                                                          + +s.match(/\d+/)

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);


它像冠军一样运行。感谢这个解决方案。你能否解释一下这行代码{ '>': 0.1, '<': -0.1, null: 0 }[s.match(/[<>](?=\s*\d)/)] + +s.match(/\d+/)。这将有助于我和其他用户在未来自己解决这类问题。 - Rohìt Jíndal

0

另一种尝试解决问题的方法,不使用正则表达式。 我不擅长使用正则表达式,所以想到了另一种替代方式。

         // Attempt to sort without regex.
         var array = ["> 30 days", "< 7 days", "< 30 days", "< 10 days"];

         array.sort(function(a,b){ 
           var first = a.split(" "); 
           var second = b.split(" ");
           if(first[0] < second[0]) {  
               return false; 
           } else if(first[0] > second[0]){ 
               return true; 
           } else { 
              var intFirst = parseInt(first[1]);
              var intSecond = parseInt(second[1]);
              if(intFirst < intSecond){
                return false; 
              } else if(intFirst >= intSecond) {
                return true;
              }
           }
         });
         
         console.log(array);


问题已经解决。 :) - Jay

0
尝试这段代码:

customSort();

var arr = ["> 30 days", "< 7 days", "30 days", "< 10 days"];
var arr2 = ["> 30 days", "< 7 days", "< 30 days", "< 10 days"];
  
console.log(customSort(arr));
console.log(customSort(arr2));
  
function customSort(array){
    function getNumber(str) {
        var a={'>': 0.1, '<': -0.1, null: 0};
        return a[str.match(/[<>](?=\s*\d)/)] + Number(str.match(/\d+/)[0]);
    }
    return array.sort(function(a, b){
        return getNumber(a)-getNumber(b);
    });
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接