参数类型不同,对应的处理逻辑不同,里面会出现大量的分支,为了消除这种分支,对参数进行归一化处理。 参数的类型有多种情况,比如下面的,有字符串有函数,怎么处理? 在下面的例子中都处理成了函数,字符串用一个函数直接返回。
<!DOCTYPE html>
<html>
<body>
<script>
formate(new Date(), 'date')
formate(new Date(), 'dateTime')
formate(new Date(), 'date',true)
formate(new Date(), 'dateTime',true)
formate(new Date(), 'yyyy年MM月dd日 HH:mm:ss', true)
function formateNormalize (formatter) {
if (typeof formatter === 'function') {
return formatter
}
else if (typeof formatter !== 'string') {
throw new Error('参数类型错误')
}
if ( formatter === 'date') {
formatter = 'yyyy-MM-dd'
}
if (formatter === 'dateTime') {
formatter = 'yyyy-MM-dd HH:mm:ss'
}
return (dateInfo) => {
const {yyyy, MM, dd, HH ,mm, ss} = dateInfo
return formatter.replace('yyyy', yyyy).
replace('MM', MM)
.replace('dd', dd)
.replace('HH', HH)
.replace('mm', mm)
.replace('ss', ss)
}
}
function formate(date, formatter, isPad = false) {
formatter = formateNormalize(formatter)
const dateInfo = {
year: date.getFullYear(),
month: date.getMonth() + 1,
day: date.getDate(),
hour: date.getHours(),
minute: date.getMinutes(),
second: date.getSeconds()
}
dateInfo.yyyy = isPad ? dateInfo.year.toString().padStart(4, 0) : dateInfo.year
dateInfo.MM = isPad ? dateInfo.month.toString().padStart(2, 0) : dateInfo.month
dateInfo.dd = isPad ? dateInfo.day.toString().padStart(2, 0) : dateInfo.day
dateInfo.HH = isPad ? dateInfo.hour.toString().padStart(2, 0) : dateInfo.hour
dateInfo.mm = isPad ? dateInfo.minute.toString().padStart(2, 0) : dateInfo.minute
dateInfo.ss = isPad ? dateInfo.second.toString().padStart(2, 0) : dateInfo.second
console.log(formatter(dateInfo))
return formatter(dateInfo)
}
</script>
</body>
</html>