JavaScript: как отображать время с помощью оператора switch?

Я хочу сгенерировать пользовательскую строку в формате времени с помощью оператора switch, в котором информация о дате передается в виде массива.

Для такого массива:

let displaySumTimes = ['00', '00', '10']

ожидаемый результат будет:

10sec

Если значение в массиве больше нуля, оно должно быть включено в отформатированную строку, возвращаемую моим оператором switch. Каждое ненулевое значение в результате также должно иметь соответствующую единицу времени, включенную в результат отформатированной строки.

Мой текущий код выглядит так:

 let displaySumTimes = ['00', '00', '10'];

 const formatTime = (time) => {
  const [hour, minute, sec] = time.split(':');
  console.info([hour, minute, sec]);
  switch([hour, minute, sec]) {
    case hour > 0:
      return `${hour} h ${minute} min ${sec} sec`;
      break;
    case minute > 0:
      return `${minute} min ${sec} sec`;
      break;
    case minute < 1:
      return `${sec} sec`;
    default:
      // code block
  }  
}

 formatTime(displaySumTimes); //output 10sec

 let displaySumTimes1 = ['00', '10', '10'];


 formatTime(displaySumTimes1); //output 10min 10 sec
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
648
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, вы могли бы применить к этому функциональный подход, который позволил бы избежать необходимости в операторе switch.

Например, вы можете динамически создать список, содержащий каждую часть результата форматированной строки (который строится на основе входных значений), а затем join() этот список пробельных символов для составления строки с требуемым форматом:

const formatTime = (time) => {
  const [h, m, s] = time;
  
  /* Dynamically build a temporary list containing each part of the formatted time depending
  on input values supplied*/
  return [].concat(
    h > 0 ? [`${ h }hr`] : [], 
    m > 0 ? [`${ m }min`] : [], 
    s > 0 ? [`${ s }sec`] : [])
  /* Join each part of the formatted time with a whitespace to achieve required formatting */
  .join(' ');
}

let displaySumTimes = ['00', '00', '10'];
let displaySumTimes1 = ['00', '10', '10'];

console.info(formatTime(displaySumTimes)); //output 10sec
console.info(formatTime(displaySumTimes1)); //output 10min 10 sec

Похоже, ваш синтаксис переключателя неверен. Вы не разрушаете там, вы переключаетесь на новый массив (который вы создаете там в условном выражении). Почему бы просто не преобразовать ваши кейсы в «если»?

Кроме того, вы используете строковый метод (split) для массива. Я не вижу строк с ":" в вашем коде. Если вы собираетесь использовать массив, который, как вы знаете, будет выглядеть так ['##', '##', '##'], вы можете использовать такие ifs:

if (hour !== "00") return `${hour} h ${minute} min ${sec} sec`;
if (minute !== "00") return `${minute} min ${sec} sec`;
return `${sec} sec`;

Вам не нужно больше там. Если сработает первый оператор if, он вернется и никогда не сработает со вторым.

James Coyle 30.05.2019 10:23

Другие вопросы по теме