参数归一化处理

203 阅读1分钟

参数类型不同,对应的处理逻辑不同,里面会出现大量的分支,为了消除这种分支,对参数进行归一化处理。 参数的类型有多种情况,比如下面的,有字符串有函数,怎么处理? 在下面的例子中都处理成了函数,字符串用一个函数直接返回。

<!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>