Invictus
Invictus

Reputation: 139

How to sort data hourwise?

I have an array of objects of this type

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

Array is of type [obj1,obj2, ....] of particular day.

This array defines that how much time is spend on activities.

I want to recreate or transform this array into time wise array like

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

I have tried to search could not help. I am a noob.

Please let me know if you need any other info. Ultimate goal is to create a hourwise chart.js graph

Upvotes: 4

Views: 109

Answers (4)

Morteza Tourani
Morteza Tourani

Reputation: 3536

Here is an implementation of how the problem could be resolved. Consider use of Map object makes the benefit of Object distinction (not needed if there is no time overlap) and Array length.

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)

Upvotes: 2

Nina Scholz
Nina Scholz

Reputation: 386654

You could split the 24 h values and count until the target hour is reached and then get the rest of the minutes to add.

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

Upvotes: 3

Mohammad Fareed
Mohammad Fareed

Reputation: 1972

You can do this by parsing the time from your input string into a date object and then comparing the date objects:

Working Demo here: http://live.datatables.net/erefom/2/edit#preview

Source here: http://live.datatables.net/erefom/2/edit

Also see this answer: What is the best way to parse a time into a Date object from user input in Javascript?

Upvotes: 1

Abhishek
Abhishek

Reputation: 3604

The best way to sort any array with respect to time is using the UTC Timestamp value. First convert the stringValue into timestamp and then sort the array according to timestamp values.

Upvotes: 0

Related Questions