资讯专栏INFORMATION COLUMN

JavaScript 工具类

CastlePeaK / 2785人阅读

摘要:在此给出一个我经常用到的数据去重方案。数组去重利用对象的特性对象中是否存在该属性数字类型的数组最大值数字类型的数组最小值格式化距现在的已过时间年前个月前天前小时前分钟前刚刚格式化现在距的剩余时间天小时分钟秒未完待补充

整理常用的工具类,提高编码效率
正则

整理日常使用较多的用户名,密码,强密码,手机号,邮箱,身份证号,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的新特性。在此给出一个我经常用到的数据去重方案。

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

未完待补充

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97330.html

相关文章

  • 2017年前端框架、库、工具大比拼

    摘要:相比于开发人员的数量,目前框架类库和工具的数量似乎更多一些。本文将会讨论目前最为流行的客户端框架类库和工具以及它们之间的基本差异。典型的类库包括字符串处理日期元素事件动画网络请求等功能。所以不需要明确的区分类库框架和工具。 相比于JavaScript开发人员的数量,目前JavaScript框架、类库和工具的数量似乎更多一些。截至2017年5月,GitHub上的快速搜索显示,有超过110...

    Alliot 评论0 收藏0
  • 前端资源系列(4)-前端学习资源分享&前端面试资源汇总

    摘要:特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 特意对前端学习资源做一个汇总,方便自己学习查阅参考,和好友们共同进步。 本以为自己收藏的站点多,可以很快搞定,没想到一入汇总深似海。还有很多不足&遗漏的地方,欢迎补充。有错误的地方,还请斧正... 托管: welcome to git,欢迎交流,感谢star 有好友反应和斧正,会及时更新,平时业务工作时也会不定期更...

    princekin 评论0 收藏0
  • JavaScript 设计模式读书笔记(五)——工厂模式

    摘要:假设有一个生产交通工具的工厂类,它包含生成多种交通工具实例的方法。在使用这个类生产对象的时候,传入参数,在参数中的属性规定我们需要的类型,构造函数就能够返回我们需要的对象类型了。 一般来说,创建对象的时候我们都习惯使用new关键字来调用constructor构造函数,但使用这种方式会有一些缺点,首先构造器函数的创建本身就是为了模仿其他一些面向对象语言的特性,有些人觉得这是non-sen...

    Eirunye 评论0 收藏0
  • React全栈--现代前端技术

    摘要:类的数据类型就是函数,类本身就指向构造函数。另一个需要注意的地方是,在子类的构造函数中,只有调用之后,才可以使用关键字,否则会报错。 1.ES6-- 新一代JavaScript标准 1.1 const和let关键字 以前只有全局变量以及函数内部的局部变量,所以以前的局部变量只能定义在函数里面,但是现在不是了,可以通过let关键字来定义局部变量。同时通过const关键字来定义常量,定义后...

    youkede 评论0 收藏0
  • 前端那些小众而又精美的网站及工具

    摘要:写此文的目的是为了总结在开发中能增加我们开发速度及能给我们带来方便的工具与网站及一些小众框架只限于简介不负责教程如有相应的教程希望大家自荐或推荐我在这里感激不尽让我们发现美并记录它第一次写文章请多多包涵如有我没有写到的但又是一些好用的工具及 写此文的目的是为了总结在开发中能增加我们开发速度及能给我们带来方便的工具与网站及一些小众框架只限于简介不负责教程如有相应的教程希望大家自荐或推荐我...

    Edison 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<