Seb
Seb

Reputation: 75

Make sums in array of object

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

Answers (2)

NinjaDev
NinjaDev

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

CertainPerformance
CertainPerformance

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

Related Questions