我有一个开放时间的列表,或多或少都是这种格式,一个值代表一整天:
[
"",
"Closed",
"8:30 AM–7:30 PM",
"9 AM–12:30 PM, 2:30–7:30 PM",
"2:30–7:30 PM",
"3–7 PM",
"10 AM–7 PM",
"8 AM–1 PM, 2:30–7 PM",
"8 AM–1 PM, 2–7 PM",
"8 AM–8:30 PM",
"9 AM–12 PM, 2:30–7 PM",
"Open 24 hours",
]
当然,时间值可以改变,但我需要在上午和下午的开放时间转换这些值,所以我需要将这些字符串转换为时间元素,然后使用13:00(下午1点)作为上午的结束,为每行生成如下内容:
[
{morning:"",afternoon:""},
{morning:"closed",afternoon:"closed"},
{morning:"8-13",afternoon:"13-19"},
{morning:"9-12:30",afternoon:"14:30-19:30"},
{morning:"closed",afternoon:"14:30-19:30"},
{morning:"closed",afternoon:"15-19"},
{morning:"10-13",afternoon:"13-19"},
{morning:"8-13",afternoon:"14:30-19"},
{morning:"8-13",afternoon:"14-19"},
{morning:"8-13",afternoon:"13-20:30"},
{morning:"9-12",afternoon:"14:30-19"},
{morning:"0-13",afternoon:"13-0"},
]
以这种方式,可以容易地分割字符串,并将其转换为易于在网页中显示和编辑的时间。
有什么建议是一个很好的解决方案,以实现这一点?
空需要保持空,开放24小时,我不知道这将是好的,把0 - 13和13 - 0。如果一天中的一部分丢失,我会添加关闭
谢谢
编辑:我已经做了这个例子的代码,与几个更多的情况下,你觉得呢??
const hours = [
"",
"Closed",
"8:30 AM–7:30 PM",
"2:30–7:30 PM",
"3–7 PM",
"10 AM–7 PM",
"8 AM–8:30 PM",
"8–10:30 AM",
"Open 24 hours",
"9–10:30 AM, 2:30–7:30 PM",
"9 AM–12:30 PM, 2:30–7:30 PM",
"8 AM–1 PM, 2:30–7 PM",
"8 AM–1 PM, 2–7 PM",
"9 AM–12 PM, 2:30–7 PM",
]
let c = []
hours.forEach(x=>{
c.push(convert(x))
})
console.log(c)
function convert(string) {
switch(string) {
case "":
return {morning:'',afternoon:''}
break;
case "Closed":
return {morning:'closed',afternoon:'closed'}
break;
case "Open 24 hours":
return {morning:'0:00-13:00',afternoon:'13:00-0:00'}
break;
}
if (string.includes(',')) {
let a = string.split(',')
let [m1,m2] = totime(a[0])
let [a1,a2] = totime(a[1])
return {morning:m1.format('H:mm')+'-'+m2.format('H:mm'),afternoon:a1.format('H:mm')+'-'+a2.format('H:mm')}
} else {
var endTime = moment('13:00', 'H:mm');
let [res1,res2] = totime(stringa)
if (res1.isBefore(endTime)){
if (res2.isAfter(endTime)) {
return {morning:res1.format('H:mm')+'-13:00',afternoon:'13:00-'+res2.format('H:mm')}
} else {
return {morning:res1.format('H:mm')+'-'+res2.format('H:mm'),afternoon:'closed'}
}
} else {
return {morning:'closed',afternoon:res1.format('H:mm')+'-'+res2.format('H:mm')}
}
}
}
function totime(s){
let b = s.split('–')
if (!(b[0].includes('AM') || b[0].includes('PM'))) {
let p = b[1].trim().split(" ")
b[0] = b[0].trim()+" "+p[1]
}
return [moment(b[0].trim(), ['h:m A', 'h:m']),moment(b[1].trim(), ['h:m A', 'h:m'])]
}
3条答案
按热度按时间bmp9r5qi1#
你可以使用JavaScript字符串操作和时间解析。你可以创建一个函数,它接受一个开放时间的数组,并在每个时间范围内迭代,在里面你可以使用
if
语句来处理不同的情况,如空字符串,关闭时间和开放24小时。另一个功能是将时间转换为24h格式。调用函数将函数内部的开放时间转换为24hbfnvny8b2#
小心,看起来你有Unicode空格、逗号和连字符。我将它们转换为
data
数组中的ASCII等价物。为了简化这一点,请先尝试将每个时隙解析成一个时间范围数组。这使得逻辑更加简单。
反向转换
您需要将每个时间范围解析为单独的小时和分钟。
一旦你这样做了,你就可以开始比较下午范围的开始和上午范围的结束。这将决定您是使用一个巨大的范围还是两个较小的子范围。
e3bfsja23#
一种可能的解析方法可以基于正则表达式结果、对正则表达式结果进行操作的一些条件以及用于不匹配的特殊/边缘情况的配置的组合。
RegExp
模式允许更多的解析灵活性,例如覆盖太多或丢失空格,意外不同的分隔符,如–
与-
或(混合)字母大小写,如AM
与am
。Such a regex pattern可以利用命名组(也是部分可选的),以便为所捕获的数据提供有意义的名称,这对于解析过程是至关重要的。在后者上,将实现用于创建营业时间数据的不同变体的条件/子句。
任何与正则表达式模式不匹配的输入值都将被清理和统一,以便作为基于对象的配置的关键,该配置涵盖所有特殊情况,如空值,完全关闭或全天候开放。