对多个时间范围进行排序

时间:2018-11-16 08:50:32

标签: javascript jquery

我目前正在从事预订应用程序项目。我想根据时间范围对创建的路线进行排序,有人知道如何在javascript / jquery中对多个时间范围进行排序吗?

例如,我有ff。时间范围(我认为每个范围都应该视为一个对象吗?);

1:01 pm - 5:00 pm,
7:00 am - 8:00 am,
10:01 am - 1:00 pm,
8:01 am - 10:00 am,

enter image description here 我计划有一个按钮可以将其从最早分类到最新分类。

像这样的东西

7:00 am - 8:00 am,
8:01 am - 10:00 am,
10:01 am - 1:00 pm,
1:01 pm - 5:00 pm

enter image description here

我还没有尝试过任何东西,因为我真的不知道从哪里开始。我希望对它的工作原理有所了解。预先谢谢您。


我对此进行了一些研究,但只找到了How to sort an array of objects with jquery or javascriptWhat is the best way to parse a time into a Date object from user input in Javascript?。因此,我对如何对时间进行排序有了想法,但是我不知道如何将其应用于时间范围。

正如我所说,我真的不知道从哪里开始,所以我还没有考虑它是数组还是对象。它可能是其中之一,我只需要知道它如何工作的想法即可。谢谢!

3 个答案:

答案 0 :(得分:1)

使用Moment.js的一种解决方案如下所示。

var timeArr = ["1:01 pm - 5:00 pm", "7:00 am - 8:00 am", "10:01 am - 1:00 pm", "8:01 am - 10:00 am"];

var sortedTime = [];
var tempTimesArr = [];

// Changing start time of the range into timestamp for comparison later and storing index of original time range to use original time range for later
timeArr.forEach(function(singleTime, index){
	var tempSingleTimeArr = singleTime.split("-");
  tempTimesArr.push({ time: moment(tempSingleTimeArr[0].trim(), "hh:mm a").unix(), index: index });
});

// sorts on the basis of start time of the range
tempTimesArr.sort(function(a, b){ return a.time - b.time; });

// Assign original time range to the new array
tempTimesArr.forEach(function(t){
	sortedTime.push(timeArr[t.index])
});
console.log(sortedTime);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

您可以在此小提琴https://jsfiddle.net/nirmalrizal/3z90gpre/27/

的控制台上检查排序的列表

答案 1 :(得分:1)

您可以编写自己的排序函数,并根据开始时间和结束时间之间的计算对数组进行排序,以根据时间范围对其进行排序。

var ranges = [{
  starttime: new Date(0,0,0,9,30,0),
  endtime: new Date(0,0,0,17,30,0),
},{
  starttime: new Date(0,0,0,7,30,0),
  endtime: new Date(0,0,0,8,30,0),
},{
  starttime: new Date(0,0,0,11,30,0),
  endtime: new Date(0,0,0,15,30,0),
}];

function compare(a,b) {
  if (a.endtime - a.starttime < b.endtime - b.starttime)
    return -1;
  if (a.endtime - a.starttime > b.endtime - b.starttime)
    return 1;
  return 0;
}

ranges.sort(compare);

console.log(ranges)

答案 2 :(得分:0)

我修改了@MarkBaijens答案,因为它仅对startTime进行排序。如果相同的多个starttime与不同的endtime不能正确排序。

var timeArr = ["1:01 pm - 5:00 pm", "7:00 am - 8:00 am", "10:01 am - 1:00 pm", "7:00 am - 8:30 am", "8:01 am - 10:00 am", "7:00 am - 7:50 am"];

var sortedTime = [];
var tempTimesArr = [];

// Changing start time of the range into timestamp for comparison later and storing index of original time range to use original time range for later
timeArr.forEach(function(singleTime, index){
	var tempSingleTimeArr = singleTime.split("-");
  tempTimesArr.push({ startTime: moment(tempSingleTimeArr[0].trim(), "hh:mm a").unix(), endTime: moment(tempSingleTimeArr[1].trim(), "hh:mm a").unix(), index: index });
});

// sorts on the basis of start time of the range
tempTimesArr.sort(function(a, b){ return ((a.startTime - b.startTime) === 0) ? (a.endTime - b.endTime) : (a.startTime - b.startTime);});

// Assign original time range to the new array
tempTimesArr.forEach(function(t){
	sortedTime.push(timeArr[t.index])
});
console.log(sortedTime);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

这是codepen

上的链接