Вставка подстроки в тип ввода времени

#javascript #arrays #input #time #format

#javascript #массивы #ввод #время #формат

Вопрос:

У меня есть калькулятор времени, который возвращает тип ввода времени в следующем формате: чч / мм / сс

В настоящее время он отображается следующим образом:

 Let time = "03:00:00"
 

Когда я выполняю функцию вычисления, вместо этого она возвращает «3: 0: 0» и удаляет «0».

Как я могу изменить это на 03:00:00? «0» должно добавляться только в том случае, если h / m / s меньше 10.

Вот моя функция вычисления, если это необходимо. Функция возвращает сумму времени для массива:

 let testOne = ["02:00:00", "01:00:00", "01:00:00"]

function test () {
let calTotalHours = testOne.map(t => t.split(':')).reduce((arr,item,index)=>{

    arr[0] = parseFloat(item[0]);
    arr[1] = parseFloat(item[1]);
    arr[2] = parseFloat(item[2]);

    if(arr[2]>=60) {
        arr[1]  ;
        arr[2]%=60;
    }
    if(arr[1]>=60) {
        arr[0]  ;
        arr[1]%=60;
    }
    return arr;
},[0,0,0])
    .join(':')
    console.log(calTotalHours)
}
 

Комментарии:

1. Вы уже ответили на свой вопрос: «если h / m / s меньше 10». Используйте if оператор, чтобы проверить, является ли значение меньше 10 (или длина <2), и добавьте ноль

2. Да, я пробовал это, но не смог решить. Когда я добавляю 0, это не позволяет мне возвращать arr в конце.

Ответ №1:

Вам нужно добавить нули после reduce , поскольку reduce все еще вычисляет время.

Я добавил a .map после вычисления, чтобы получить каждое значение времени, а затем проверить, является ли значение меньше 10:

.map((v) => (v < 10) ? v = "0" v : v)

 let testOne = ["02:00:00", "01:00:00", "01:00:00"]

function test() {
  let calTotalHours = testOne.map(t => t.split(':')).reduce((arr, item, index) => {

    arr[0]  = parseFloat(item[0]);
    arr[1]  = parseFloat(item[1]);
    arr[2]  = parseFloat(item[2]);

    if (arr[2] >= 60) {
      arr[1]  ;
      arr[2] %= 60;
    }
    if (arr[1] >= 60) {
      arr[0]  ;
      arr[1] %= 60;
    }

    return arr;
  }, [0, 0, 0]).map((v) => (v < 10) ? v = "0"   v : v).join(':')
  console.log(calTotalHours)
}

test() 

Комментарии:

1. Спасибо, чувак! Карта была именно тем, что я искал! Спасибо 🙂

Ответ №2:

Вы можете сделать что-то подобное, чтобы получить то, что вы хотите, используя padStart() функцию

 let testOne = ["02:00:00", "01:00:00", "01:00:00"]

function test() {
  let calTotalHours = testOne.map(t => t.split(':')).reduce((arr, item, index) => {

      arr[0]  = parseFloat(item[0]);
      arr[1]  = parseFloat(item[1]);
      arr[2]  = parseFloat(item[2]);

      if (arr[2] >= 60) {
        arr[1]  ;
        arr[2] %= 60;
      }
      if (arr[1] >= 60) {
        arr[0]  ;
        arr[1] %= 60;
      }


      return arr;
    }, [0, 0, 0])
    .map((num) => num.toString().padStart(2, 0)) //add 0 to each value here if they are less than 10
    .join(':');
  console.log(calTotalHours);

}
test(); 

Комментарии:

1. использование padStart здесь было приятным, дало мне 1

2. pasStart также может выполнить эту работу! Спасибо за пример. Я уже пометил ответ Кальвина как решаемый, но это тоже работает.

Ответ №3:

Вы могли бы попробовать использовать .padStart() перед присоединением к массиву:

 .map(num => num.toString().padStart(2, '0'))
 

Это заполнит начальные 0, где длина меньше 2