JavaScript: как отображать время с помощью оператора switch? - PullRequest
1 голос
/ 30 мая 2019

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

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

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

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

10sec

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

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

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

 const formatTime = (time) => {
  const [hour, minute, sec] = time.split(':');
  console.log([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

Ответы [ 3 ]

4 голосов
/ 30 мая 2019

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

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

if (hour !== "00") return `${hour} h ${minute} min ${sec} sec`;
if (minute !== "00") return `${minute} min ${sec} sec`;
return `${sec} sec`;
3 голосов
/ 30 мая 2019

Возможно, вы могли бы применить функциональный подход к этому, чтобы избежать необходимости в выражении 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.log(formatTime(displaySumTimes)); //output 10sec
console.log(formatTime(displaySumTimes1)); //output 10min 10 sec
0 голосов
/ 30 мая 2019

Интересно ...

В вашей функции switch будет сравнивать ссылку на массив [часы, минуты, секунды] со значениями логического типа в каждом случае (часы> 0, минуты> 0 и минуты <1). Это не работает ... </p>

...