Создание сумм в массиве объекта

#javascript

#javascript

Вопрос:

У меня есть массив объектов :

 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}]
  

Мне нужно рассчитать относительный диапазон продолжительности на временной шкале от 0 до 1 :

 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 },
       // .......
        }
      }
   })
  

в конце функции мне нужно иметь что-то вроде этого:

 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}}]
  

Как я могу сделать?

Ответ №1:

Во время итерации следите за количеством времени, которое было повторено до сих пор:

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

Ответ №2:

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