JavaScript 工具類

整理經常使用的工具類,提升編碼效率

正則

整理平常使用較多的用戶名,密碼,強密碼,手機號,郵箱,身份證號,QQ以及微信號的驗證數組

class _Regexp {
    /**
     * 用戶名, 4到16位(字母,數字,下劃線,減號)
     * @param {String} str 
     */
    isUser(str) {
        return /^[a-zA-Z0-9_-]{4,16}$/.test(str)
    }

    /**
     * 密碼, 以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線
     * @param {String} str 
     */
    isPassword() {
        return /^[a-zA-Z]\w{5,17}$/.test(str)
    }

    /**
     * 強密碼, 最少6位,至少1個大寫字母,1個小寫字母,1個數字,1個特殊字符
     * @param {String} str
     */
    isStrongPassword(str) {
        return /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*?]).*$/.test(str)
    }

    /**
     * 手機號
     * @param {String} str 
     */
    isPhone(str) {
        return /^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$/.test(str)
    }

    /**
     * 郵箱
     * @param {String} str 
     */
    isEmail(str) {
        return /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(str)
    }

    /**
     * 身份證號
     * @param {String} str 
     */
    isIdCard(str) {
        return /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(str)
    }

    /**
     * QQ, 5-11位
     * @param {String} str 
     */
    isQQ(str) {
        return /^[1-9][0-9]{4,10}$/.test(str)
    }

    /**
     * 微信, 6-20位,以字母開頭,(字母,數字,減號,下劃線)
     * @param {String} str 
     */
    isWeChart(str) {
        return /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/.test(str)
    }
}

字符串

整理字符串去除全部空格,隨機密碼以及如何檢測密碼強度微信

class _String {
    /**
     * 去除字符串中全部空格
     * @param {String} str 
     */
    trimAll(str) {
        return str.replace(/\s+/g, '')
    }

    /**
     * 隨機碼, randomPassword(36) -> h9q9b4mytk
     * @param {Number} count 
     */
    randomPassword(count) {
        return Math.random().toString(count).substring(2)
    }

    /**
     * 檢測密碼強度
     * @param {String} str 
     */
    checkPassword(str) {
        let level = 0
        if (str.length < 6) {
            return level
        }
        if (/[0-9]/.test(str)) {
            level ++
        }
        if (/[a-z]/.test(str)) {
            level ++
        }
        if (/[A-Z]/.test(str)) {
            level ++
        }
        if (/[\.|_]/.test(str)) {
            level ++
        }
        return level
    }
}

數組

數組去重,網上有不少種用法,好比使用indexOf,splice以及ES6種set的新特性。在此給出一個我常常用到的數據去重方案。app

class _Array {
    /**
     * 數組去重, 利用對象的特性
     * @param {Array} old_arr 
     */
    removeRepeat(old_arr) {
        let new_arr = []
        let obj = {}
        for (let i = 0, len = old_arr.length; i < len; i++) {
            // 對象中是否存在該屬性
            if (!obj[old_arr[i]]) {
                new_arr.push(old_arr[i])
                obj[old_arr[i]] = i
            }
        }
        return new_arr
    }

    /**
     * 數字類型的數組最大值
     * @param {Array} arr 
     */
    maxArr(arr) {
        return Math.max.apply(null, arr)
    }

    /**
     * 數字類型的數組最小值
     * @param {Array} arr 
     */
    minArr(arr) {
        return Math.min.apply(null, arr)
    }
}

Date

class _Date {
    /**
     * 格式化${startTime}距如今的已過期間
     * @param {Date} startTime 
     */
    formatPassTime(startTime) {
        let currentTime = Date.parse(new Date())
        let time = currentTime - startTime
        let day = parseInt(time / (1000 * 60 * 60 * 24))
        let hour = parseInt(time / (1000 * 60 * 60))
        let min = parseInt(time / (1000 * 60))
        let month = parseInt(day / 30)
        let year = parseInt(month / 12)

        if (year) {
            return year + '年前'
        }
        if (month) {
            return month + '個月前'
        }
        if (day) {
            return day + '天前'
        }
        if (hour) {
            return hour + '小時前'
        }
        if (min) {
            return min + '分鐘前'
        } else {
            return '剛剛'
        }
    }

    /**
     * 格式化如今距${endTime}的剩餘時間
     * @param {Date} endTime 
     */
    formatRemainTime(endTime) {
        let startDate = new Date()
        let endDate = new Date(endTime)
        let t = endDate.getTime() - startDate.getTime()
    
        let d = 0
        let h = 0
        let m = 0
        let s = 0
    
        if (t >= 0) {
            d = Math.floor(t / 1000 / 3600 / 24)
            h = Math.floor(t / 1000 / 60 / 60 % 24)
            m = Math.floor(t / 1000 / 60 % 60)
            s = Math.floor(t / 1000 % 60)
        }
    
        return d + '天 ' + h + '小時 ' + m + '分鐘 ' + s + '秒'
    }
}

Object

var type = function(o) {
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};

['Null',
 'Undefined',
 'Object',
 'Array',
 'String',
 'Number',
 'Boolean',
 'Function',
 'RegExp'
].forEach(function(t) {
  type['is' + t] = function(value) {
    return type(value) === t.toLowerCase();
  };
});

type.isObject({})      // true
type.isNumber(NaN)     // true

未完待補充dom

相關文章
相關標籤/搜索