Я хотел бы рассчитать общую продолжительность упражнений на основе значений «отдыха» и «повторений».
Вот пример объекта 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, которая возвращает индивидуальную продолжительность для каждого элемента.
Я бы хотел, чтобы была добавлена общая продолжительность всех упражнений.
Я делаю расчет: 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>
);
})}
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");
Я не очень понимаю вашу проблему здесь, так как все, что у вас есть, работает ...
Единственное, что вам нужно сделать, это вывести общий расчет за пределы функции, например:
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.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.