按小时排序对象数组

时间:2014-09-19 11:47:02

标签: javascript arrays sorting

我有一个带有小时(fc_start_time)属性的对象数组,我想通过这个属性对它进行排序。我试过this,但它对我不起作用。 这是对象结构:

Object { 
         id="540-events", 
         local_id=540, 
         title="Mas Flow", 
         fc_start_time="12:30 pm"
},
Object { 
         id="531-events", 
         local_id=531, 
         title="Slowly", 
         fc_start_time="04:30 pm"
},
Object { 
         id="531-events", 
         local_id=531, 
         title="Slowly", 
         fc_start_time="08:30 am"
}

提前致谢。

4 个答案:

答案 0 :(得分:2)

日期和时间,是吗?我恨他们。让我们试着解决这个问题。

如何排序数组?在array's sort method的帮助下。默认情况下,此方法对字符串进行排序,但我们需要自定义比较函数。

我们如何比较字符串中的时间?我们可以使用Date对象,解析时间,从1970年开始获得毫秒,然后比较它们。但我们这里有am-pm格式。因此,要使用Date.parse方法,我们需要先convert time to 24 hour format(或使用Date.js库)。

function convertTo24Hour(time) {

  var hours = parseInt(time.substr(0, 2));

  if(time.indexOf('am') != -1 && hours == 12) {
    time = time.replace('12', '0');
  }
  if(time.indexOf('pm')  != -1 && hours < 12) {
    time = time.replace(hours, (hours + 12));
  }

  return time.replace(/(am|pm)/, '');
}

我们得到24小时后,我们可以像这样解析它(不要在时间之前查看日期,这并不重要,我们关心的只是时间):

Date.parse( '9/19/2014 ' + convertTo24Hour(time) );

现在我们可以在array.sort比较功能中使用它。我们只比较两个数字1411129800000 ? 1411132800000,决定哪一个更大并排序数组。

function compare(a,b) {

  var atime = Date.parse('9/19/2014 ' + convertTo24Hour(a.time));
  var btime = Date.parse('9/19/2014 ' + convertTo24Hour(b.time));

  if (atime < btime) {
     return -1;
  }

  if (atime > btime) {
    return 1;
  }

  return 0;
}

毕竟我们得到了什么:

  1. 使用array.sort比较功能对元素进行排序
  2. 将时间转换为数字,以便我们可以正确比较它们
  3. 为此,请将12h时间格式转换为24并使用Date.parse
  4. 这是jsfiddle与 - http://jsfiddle.net/rqgmkdbs/

    一起玩

答案 1 :(得分:0)

var input = [{hour:1, minutes:10},{hour:4, minutes: 1}, ...];
input.sort(function (a, b)
{
    // compare hours first
    if (a.hour < b.hour) return -1;
    if (a.hour > b.hour) return 1;

    // else a.hour === b.hour, so compare minutes to break the tie
    if (a.minute < b.minute) return -1;
    if (a.minute > b.minute) return 1;

    // couldn't break the tie
    return 0;
});

答案 2 :(得分:0)

根据与示例相同的时间输入尝试此比较功能。它比较了您的时间值浮动表示法。

<script>
    var objs = [
        {id:"540-events",local_id:540,title:"Mas Flow",fc_start_time:"12:30 pm"},
        {id:"540-events",local_id:540,title:"Mas Flow",fc_start_time:"10:30 pm"},
        {id:"540-events",local_id:540,title:"Mas Flow",fc_start_time:"12:30 pm"},
        {id:"540-events",local_id:540,title:"Mas Flow",fc_start_time:"14:30 pm"},
        {id:"540-events",local_id:540,title:"Mas Flow",fc_start_time:"09:30 pm"}
    ]       
    function compare(a,b) {
        var time1 = parseFloat(a.fc_start_time.replace(':','.').replace(/[^\d.-]/g, ''));
        var time2 = parseFloat(b.fc_start_time.replace(':','.').replace(/[^\d.-]/g, ''));
        if(a.fc_start_time.match(/.*pm/)) time1 += 12; if(b.fc_start_time.match(/.*pm/)) time2 += 12;
        if (time1 < time2) return -1;
        if (time1 > time2) return 1;
        return 0;
    }   
    objs.sort(compare);
    console.log(objs);      
</script>

答案 3 :(得分:0)

试试这个。您必须在时间内考虑ampm

<!doctype html>
</html>
    <head>
        <meta charset="utf-8">      
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                // The data
                var data = [
                   { id:"540-events", local_id:540, title:"Mas Flow", fc_start_time:"12:30 pm"}, 
                   { id:"531-events", local_id:531, title:"Slowly", fc_start_time:"04:30 pm"}, 
                   { id:"545-events", local_id:545, title:"Mas Flow 2", fc_start_time:"03:30 am"}
                ]
                // Sort values
                data.sort(function(a,b){
                    var aValue = new Number(a.fc_start_time.replace(/\d*/g,""));
                    var bValue = new Number(b.fc_start_time.replace(/\d*/g,""));
                    if( aTime.match(/.*pm/) ){
                        aValue + 12;
                    }
                    return aValue - bValue;    
                });
                // Show values
                for( var i = 0; i < data.length; i++){
                    $("ul").append("<li>"+data[i].fc_start_time+"</li>");
                }
        });
        </script>
    </head>
    <body>
        <ul>        
        </ul>
    </body>
</html>