有没有更简单的方法来拆分“134h22m54s”?

时间:2021-01-29 15:15:36

标签: javascript object split

我从 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"
}

我想知道是否有更简单的方法来解析这种类型的数据。

4 个答案:

答案 0 :(得分:2)

作为一个简单但不是防弹的解决方案,您可以通过数字字符和splitfilter您的字符串 数字

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]}
}

Explanation on regex101

答案 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]}
}
相关问题