我从 API 获取诸如“134h22m54s”之类的数据。使用我创建的函数,它返回一个对象,包括小时、分钟和秒。
这里是我的分割函数:
parseHMS (value) { // value = "134h22m54s" or "3m0s" or only "0s"
let hour = "0";
let minute = "0";
let second = "0";
if (value.includes('h')) {
let splitByHour = value.split('h');
hour = splitByHour[0]
value = splitByHour[1];
}
if (value.includes('m')) {
let splitByHour = value.split('m');
minute = splitByHour[0]
value = splitByHour[1];
}
if (value.includes('s')) {
let splitByHour = value.split('s');
minute = splitByHour[0]
}
return {h: hour, m: minute, s: second}
}
和输出:
{
h: "134",
m: "22",
s: "54"
}
我想知道是否有更简单的方法来解析这种类型的数据。
答案 0 :(得分:2)
作为一个简单但不是防弹的解决方案,您可以通过数字字符和split
来filter
您的字符串 数字。
const [h,m,s] = "134h22m54s".split(/(\d+)/).filter(Number);
console.log(h,m,s);
答案 1 :(得分:2)
您可以使用正则表达式:
function parseDuration(s) {
var m = /(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m?)?/.exec(s);
return {
days: parseInt(m[1], 10) || 0,
hours: parseInt(m[2], 10) || 0,
minutes: parseInt(m[3], 10) || 0
};
}
console.log(parseDuration('10d12h59m'));
console.log(parseDuration('10d12h'));
console.log(parseDuration('10d'));
console.log(parseDuration('12h'));
console.log(parseDuration('70'));
答案 2 :(得分:1)
我建议在这里使用正则表达式。这可以使用带有量词的非捕获组有选择地匹配字符串的一部分(即它可能存在也可能不存在)。
let parseHMS = (value) => {
let reg = /(?:(?:(\d+)h)?(?:(\d+)m)?)?(\d+)s/
let result = reg.exec(value)
return {h: result[1], m: result[2], s: result[3]}
}
答案 3 :(得分:0)
你可以改进它,但也许像这样的正则表达式:
const parseHMS = (value) => {
let reg = /((\d+)h)?((\d+)m)?((\d+)s)/
let result = reg.exec(value)
return {h: result[2], m: result[4], s: result[6]}
}