This should do it. What it does is go trough each list (jobs, users, data_points) and reduce every one of them to the max date representing it.
let data = {
"jobs": [{
"job_id": 10,
"users": [{
"user_id": 11,
"data_points": [{
"duration": 0,
"start_time": "2017-07-20T04:04:43.000Z",
"datastream": "GENERIC",
"username": "[email protected]"
}, {
"duration": 0,
"start_time": "2017-07-21T04:04:43.000Z",
"datastream": "GENERIC",
"username": "[email protected]"
}, {
"duration": 0,
"start_time": "2017-07-20T04:04:43.000Z",
"datastream": "GENERIC",
"username": "[email protected]"
}]
}]
}]
}
let max = data.jobs.reduce((prev, job) => {
let maxJobStartTime = job.users.reduce((prev, user) => {
let maxUserStartTime = user.data_points.reduce((prev, point) => {
return prev - new Date(point.start_time).getTime() > 0 ? prev : new Date(point.start_time).getTime();
}, 0)
console.log(maxUserStartTime);
return prev - maxUserStartTime > 0 ? prev : maxUserStartTime;
}, 0)
return prev - maxJobStartTime > 0 ? prev : maxJobStartTime;
}, 0)
console.log(new Date(max));
See a working playground example here.
A breakdown:
interface User {
user_id: number,
data_points: { start_time: string }[]
}
interface Job {
job_id: number,
users: User[]
}
interface Data {
jobs: Job[]
}
// max time from a user's data_points
function maxUserStartTime(user: User) {
return user.data_points.reduce((prev, point) => {
return prev - new Date(point.start_time).getTime() > 0 ? prev : new Date(point.start_time).getTime();
}, 0);
}
//using the max time of an user calculate the max time of all users in a job
function maxJobStartTime(job: Job) {
return job.users.reduce((prev, user) => {
let max = maxUserStartTime(user);
return prev - max > 0 ? prev : max;
}, 0);
}
// using the max time for a job calculate the max time out of all jobs
function maxTime(data: Data) {
return data.jobs.reduce((prev, job) => {
let max = maxJobStartTime(job)
return prev - max > 0 ? prev : max;
}, 0);
}
console.log(new Date(maxTime(data)));
A working example of the clean version can be found here.