Я хотел бы рассчитать общую продолжительность упражнений на основе значений «отдыха» и «повторений».

Вот пример объекта json для "упражнений"

{
"warmUp": [
    {
        "title": "Abdominal Crunch",
        "id": "4YRrftQysvE1Kz8XACtrq4",
        "rest": [
            "30",
            "30",
            "30",
            "30",
            "30",
            "",
            "",
            "",
            "",
            ""
        ],
        "reps": [
            "5",
            "5",
            "5",
            "5",
            "5",
            "",
            "",
            "",
            "",
            ""
        ],
        "time": false,
    },
    {
        "title": "Bicep curl",
        "rest": [
            "30",
            "30",
            "30",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
        ],
        "reps": [
            "5",
            "5",
            "",
            "5",
            "",
            "",
            "",
            "",
            "",
            ""
        ],
        "time": false
    }
]}

У меня сложность в том, что значения находятся во вложении, и в настоящее время я отображаю их в функции .map, которая возвращает индивидуальную продолжительность для каждого элемента.

You can see the 2 durations beneath, I would like to have a total duration

Я бы хотел, чтобы была добавлена ​​общая продолжительность всех упражнений.

Я делаю расчет: const Total = totalReps * 4 + parseInt(totalRest);

      {exercises.map((exercise) => {
        const reps = exercise.reps.map((i) => Number(i));
        const rest = exercise.rest.map((i) => Number(i));
        // console.log("reps ", reps);
        // console.log("rest ", rest);

        const totalReps = reps.reduce((a, b) => a + b, 0);
        const totalRest = rest.reduce((a, b) => a + b, 0);
        // console.log("totalReps ", totalReps);
        // console.log("totalRest ", totalRest);

        const Total = totalReps * 4 + parseInt(totalRest);
        // console.log("total ", Total);

        let sec_num = parseInt(Total, 10); // don't forget the second param
        let hours = Math.floor(sec_num / 3600);
        let minutes = Math.floor((sec_num - hours * 3600) / 60);
        let seconds = sec_num - hours * 3600 - minutes * 60;

        if (hours < 10) {
          hours = "0" + hours;
        }
        if (minutes < 10) {
          minutes = "0" + minutes;
        }
        if (seconds < 10) {
          seconds = "0" + seconds;
        }
        return (
          <Paragraph>
            Total Workout Duration: {hours}:{minutes}:{seconds}
          </Paragraph>
        );
      })}
0
David Riches 11 Фев 2021 в 14:29

2 ответа

Лучший ответ

Вот пример, который упрощает код и собирает общую сумму.

Также вы выполняли оператор return вывода html. Я добавил console.log. Я закомментировал возврат html для короткого примера, который просто выводится на консоль.

const exercises = [
  {
    title: 'Abdominal Crunch',
    id: '4YRrftQysvE1Kz8XACtrq4',
    rest: ['30', '30', '30', '30', '30', '', '', '', '', ''],
    reps: ['5', '5', '5', '5', '5', '', '', '', '', ''],
    time: false
  },
  {
    title: 'Bicep curl',
    rest: ['30', '30', '30', '', '', '', '', '', '', ''],
    reps: ['5', '5', '', '5', '', '', '', '', '', ''],
    time: false
  }
];

function showTotal(total, prefix) {
  let sec_num = parseInt(total, 10); 
  let hours = Math.floor(sec_num / 3600);
  let minutes = Math.floor((sec_num - hours * 3600) / 60);
  let seconds = sec_num - hours * 3600 - minutes * 60;

  if (hours < 10) {
    hours = "0" + hours;
  }
  if (minutes < 10) {
    minutes = "0" + minutes;
  }
  if (seconds < 10) {
    seconds = "0" + seconds;
  }
  console.log(`${prefix}: ${hours}:${minutes}:${seconds}`)
  /* return (
      <Paragraph>
        {prefix}: {hours}:{minutes}:{seconds}
      </Paragraph>
    ); */
}

let grandTotal = 0
exercises.map((exercise) => {
  const totalReps = exercise.reps.reduce((a, b) => a + parseInt(b || 0, 10), 0);
  const totalRest = exercise.rest.reduce((a, b) => a + parseInt(b || 0, 10), 0);

  const total = totalReps * 4 + parseInt(totalRest);
  grandTotal += total
  return showTotal(total, `Total ${exercise.title} Duration`);        
})

showTotal(grandTotal, "Grand Total");
1
Always Learning 11 Фев 2021 в 12:05

Я не очень понимаю вашу проблему здесь, так как все, что у вас есть, работает ...

Единственное, что вам нужно сделать, это вывести общий расчет за пределы функции, например:

     function retrieveWorkoutDuration(total) {
        let sec_num = parseInt(total, 10); // don't forget the second param
        let hours = Math.floor(sec_num / 3600);
        let minutes = Math.floor((sec_num - hours * 3600) / 60);
        let seconds = sec_num - hours * 3600 - minutes * 60;

        if (hours < 10) {
          hours = "0" + hours;
        }
        if (minutes < 10) {
          minutes = "0" + minutes;
        }
        if (seconds < 10) {
          seconds = "0" + seconds;
        }
        return (
          <Paragraph>
            Total Workout Duration: {hours}:{minutes}:{seconds}
          </Paragraph>
        );
     }

И в конце вам просто нужно просуммировать всю продолжительность тренировки и отправить это число в функцию retrieveWorkoutDuration.

1
Aion 11 Фев 2021 в 11:52
66153851