如何按小时对数据进行排序?

4

我有一个由此类型的对象组成的数组

Obj = { timeEnd:"06:45 AM",
        timeStart:"04:23 AM"
      }

数组的类型是特定日期的[obj1,obj2, ....]

该数组定义了活动所花费的时间。

我想重新创建或转换此数组为按时间排列的数组,如下所示:

obj = { '4-5 AM' : 37,
        '5-6 AM' : 60,
        '6-7 AM' : 45
      }

我尝试搜索但没有找到帮助。我是一个新手。

如果您需要其他信息,请告诉我。最终目标是创建一个按小时显示的chart.js图表。


哪个时间被分组了?后面的数字是什么? - Nina Scholz
时间开始和时间结束之间的差异可以是以分钟或小时为单位。我必须按小时进行分离。 - Invictus
4个回答

3

你可以将24小时的时间值分割,并计算直到达到目标小时,然后获取剩余的分钟进行添加。

function getHourParts(object) {

    function getKey(h) {
       return h + '-' + (h + 1);
    }

    function getTime(s) {
        var t = s.split(':').map(Number);
        return { h: t[0], m: t[1] };
    }

    var result = {},
        start = getTime(object.timeStart),
        end = getTime(object.timeEnd);

    while (start.h < end.h) {
        result[getKey(start.h)] = 60 - start.m;
        ++start.h;
        start.m = 0;
    }
    result[getKey(end.h)] = end.m - start.m;
    return result;
}

console.log(getHourParts({ timeStart: '04:23', timeEnd: '06:45' }));
console.log(getHourParts({ timeStart: '12:03', timeEnd: '12:05' }));


2
这里有一个解决该问题的实现。考虑使用Map对象,可以获得Object区别的好处(如果没有时间重叠,则不需要),以及Array长度的好处。

var durations = [{timeStart: "04:23 AM", timeEnd: "06:45 AM", }, {timeStart: "09:23 AM", timeEnd: "11:30 AM", }, {timeStart: "11:09 PM", timeEnd: "01:19 PM", }];

function getValue(time) {
 var [hour, minute, period] = time.replace(':', ' ').split(' ');
 var date = new Date();
 date.setHours((period === 'PM' ? 12 : 0) + +hour, +minute);
 return date;
}

var result = {};

durations.forEach(duration => {
 var time = getValue(duration.timeStart),
  end = getValue(duration.timeEnd);

 for (var hour = time.getHours(); hour <= end.getHours(); hour++) {
  var endMinute = hour === end.getHours() ? end.getMinutes() : 59,
   minute = 0,
   hourSpan = `${hour}-${hour + 1}`;

  result[hourSpan] = result[hourSpan] || new Map;
  while (minute <= endMinute)
   result[hourSpan].set(minute, minute++);
 }
});
Object.keys(result).forEach(span => {
 result[span] = result[span].size;
});
console.clear();
console.log(result)


1

有趣,我会仔细看一下。谢谢! - Snopzer

0

按时间排序任何数组的最佳方法是使用UTC时间戳值。首先将stringValue转换为时间戳,然后根据时间戳值对数组进行排序。


如何根据小时数进行划分? - Invictus
我认为你可以减去时间戳以获得实际的秒数差异。 - Abhishek
并且您可以将其转换为小时。 - Abhishek
基本上听起来可能很复杂,但实际上很容易。 - Abhishek
但是时间没有上午/下午的区别。 - Nina Scholz
显示剩余2条评论

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