Reputation: 75
I have an array of object :
myArray = [{id: 998, order: 0, duration: 0.2},
{id: 999, order: 1, duration: 0.2},
{id: 1, order: 2, duration: 0.2},
{id: 997, order: 3, duration: 0.2},
{id: 1, order: 4, duration: 0.2}]
I need to calculate the relative range of duration in a 0 to 1 timeline :
myArray.forEach((item, index) => {
if ( index === 0 ) {
item.range = {min: 0, max: item.duration}
else if (index === myArray.lenght - 1) {
item.range = {min: 1 - item.duration, max: 1}
else {
// TODO : pseudo code
//Maybe a loop
//if item[1] ? item.range = {min: item[0].range.max , max: item[0].range.max + item[1].duration },
//if item[2] ? item.range = {min: item[1].range.max , max: item[1].range.max + item[2].duration },
//if item[3] ? item.range = {min: item[2].range.max , max: item[2].range.max + item[3].duration },
// .......
}
}
})
at the end of the function I need to have something like this:
myArray = [{id: 998, order: 0, duration: 0.2, range: {min: 0, max: 0.2}},
{id: 999, order: 1, duration: 0.2, range: {min: 0.2, max: 0.4}},
{id: 1, order: 2, duration: 0.2, range: {min: 0.4, max: 0.6}},
{id: 997, order: 3, duration: 0.2, range: {min: 0.6, max: 0.8}},
{id: 1, order: 4, duration: 0.2, range: {min: 0.8, max: 1}}]
How can I do ?
Upvotes: 1
Views: 35
Reputation: 402
const myArray = [{id: 998, order: 0, duration: 0.2},
{id: 999, order: 1, duration: 0.2},
{id: 1, order: 2, duration: 0.2},
{id: 997, order: 3, duration: 0.2},
{id: 1, order: 4, duration: 0.2}];
let currentMin = 0
myArray.forEach((item) => {
item.range = {min: currentMin, max: Math.round((currentMin + item.duration) * 1000) / 1000}
currentMin = item.range.max
})
console.log(myArray);
Upvotes: 0
Reputation: 370729
While iterating, keep track of the amount of duration iterated over so far:
const myArray = [{id: 998, order: 0, duration: 0.2},
{id: 999, order: 1, duration: 0.2},
{id: 1, order: 2, duration: 0.2},
{id: 997, order: 3, duration: 0.2},
{id: 1, order: 4, duration: 0.2}];
let durationSoFar = 0;
for (const item of myArray) {
const min = durationSoFar;
// Round to 3 decimal places to avoid floating point problems
durationSoFar = Math.round((item.duration + min) * 1000) / 1000;
item.range = { min, max: durationSoFar };
}
console.log(myArray);
Upvotes: 2