我遇到了一个挑战,要创建一个将基于字符串的时间转换为毫秒的函数。
这是我给出的字符串格式:
“小时:分钟: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);
}
答案 0 :(得分: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);

答案 1 :(得分:3)
还有一个:
let ms = str.split(':').reduce((a,v,i) => a + v * [3600000, 60000, 1000, 1][i], 0)
编辑,感谢@Swonkie:
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 :(得分:-1)
如下所述:
这看起来很好解决方案:
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 solution”
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