2016-08-08 4 views
0

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

Это формат строки я получил:

"часы: минуты: seconds.milliseconds"

Так это значение, например, нужно будет возвращать 3010220.

"0: 50: 10.220"

Функция должен быть коротким и одно выровненным. Мне очень хотелось бы знать, где я могу улучшить функцию ниже, поскольку она не прошла критерии. как это можно превратить в один лайнер?

function toMilliseconds(time){ 
    return time.match(/[0-9]+/g).map(function(val,s,a){ 
    return s != 3 ? +val * ((Math.pow(60,a.length - s -2) * 1000)) : +val; 
    }).reduce(function(a,b){ 
    return a+b; 
    },0); 
} 
+4

«Функция должна быть короткий и один выровненный ». - Зачем это нужно, чтобы выстроились? Похоже на ужасное требование – tymeJV

+0

Откуда взялся вызов? Вы можете обратиться за помощью? – putvande

+0

Как '0: 50' стать' 30'? Должно ли быть «0,5» (полчаса)? – Archer

ответ

3

Существует много разных способов.

Это самый короткий путь я могу думать (используя ES6):

var str = "0:50:10.220"; 
 

 
var ms = (s=>1E3*s[2]+6E4*s[1]+36E5*s[0])(str.split(':')); 
 

 
console.log(ms);

+0

Это безумие = D – robertklep

+0

@robertklep Совершенно сумасшедший: o – Radicate

+1

Вот еще один: '((a, b, c) => + c + b * 60 + a * 3600) (... str.split (':')) * 1E3' – robertklep

-1

Как описано здесь:

https://codereview.stackexchange.com/questions/45335/milliseconds-to-time-string-time-string-to-milliseconds

это выглядит как хорошее решение:

function timeString2ms(a,b){// time(HH:MM:SS.mss) // optimized 
return a=a.split('.'), // optimized 
    b=a[1]*1||0, // optimized 
    a=a[0].split(':'), 
    b+(a[2]?a[0]*3600+a[1]*60+a[2]*1:a[1]?a[0]*60+a[1]*1:a[0]*1)*1e3 // optimized 
} 

"oneline решение"

function timeString2ms2(a,b){ return a=a.split('.'),b=a[1]*1||0,a=a[0].split(':'),b+(a[2]?a[0]*3600+a[1]*60+a[2]*1:a[1]?a[0]*60+a[1]*1:a[0]*1)*1e3 } 

Использование

console.log(timeString2ms('10:21:32.093')); // hh:mm:ss.mss 
console.log(timeString2ms('21:32.093')); // mm:ss.mss 
console.log(timeString2ms('21:32')); // mm:ss 
console.log(timeString2ms('32.093')); // ss.mss 
console.log(timeString2ms('32')); // ss 
console.log(timeString2ms('32467.784')); // seconds.ms 
console.log(timeString2ms(32467.784+'')); // seconds.ms 
+0

Его не 1 строка, хотя , И лучше отметить это как дубликат. – putvande

+0

обновил мой ответ на «однострочное» решение. Но это один и тот же ответ, менее читаемый. И я не могу пометить дубликат вне SO –

3

И еще один:

let ms = str.split(':').reduce((a,v,i) => a + v * [3600000, 60000, 1000, 1][i], 0) 

EDIT, благодаря @Swo nkie:

let ms = str.split(':').reduce((a,v,i) => a + v * [3600000, 60000, 1000][i], 0) 

Что приводит к (спасибо @Arnauld):

let ms = str.split(':').reduce((a,v,i)=>a+v*1E3*[3600,60,1][i],0); 

Или, с закруглением (не тестируются на валидность):

let ms = str.split(':').reduce((a,v,i)=>a+v*1E3*[3600,60,1][i],0.5)|0; 
+2

. В массиве есть только 3 элемента (h, m, s с десятичными знаками), поэтому последний ', 1' не требуется в вашем код. – Swonkie

+0

@Swonkie, конечно, вы абсолютно правы :) – robertklep

+1

'0: 0: 1.001'.split (': '). Reduce ((a, v, i) => a + v * 1000 * [3600,60 , 1] [I], 0); //1000.9999999999999 –

Смежные вопросы