美文网首页
JS常用功能扩展方法,大家要用自己拿

JS常用功能扩展方法,大家要用自己拿

作者: Aweber | 来源:发表于2018-11-27 11:42 被阅读0次
    
    
    (function () {
    
        //#region Date对象相关扩展
    
        /*
         * 格式化
         * @param {Date} date 日期
         * @param {String} fmt 格式
         * @return {String} 日期
         */
        Date.format = function (date, fmt) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            if (typeof (fmt) !== "string") {
                throw new Error("type of fmt is wrong.");
            }
    
            var _getHours = function (tag) {
                var hours = date.getHours();
                return hours === 0 ? 0 :
                    hours > 12 ? hours - 12 : hours;
            }
    
            var o = {
                "M+": date.getMonth() + 1,                      //月份    
                "d+": date.getDate(),                           //日    
                "H+": date.getHours(),                          //小时(0-23)  
                "h+": _getHours("h"),                           //小时(1-12)     
                "m+": date.getMinutes(),                        //分    
                "s+": date.getSeconds(),                        //秒      
            };
    
            if (/(y+)/.test(fmt)) {
                fmt = fmt.replace(RegExp.$1, RegExp.$1.length <= 2 ?
                    date.getFullYear().addPreZero(4).slice(-2) :
                    date.getFullYear().addPreZero(4).slice(-4));
            }
    
            if (/(f+)/.test(fmt)) {
                fmt = fmt.replace(RegExp.$1,
                    date.getMilliseconds().addPreZero(3).substring(0, RegExp.$1.length));
            }
    
            for (var k in o) {
                if (new RegExp("(" + k + ")").test(fmt)) {
                    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ?
                        o[k].toString() : o[k].addPreZero(2));
                }
            }
    
            return fmt;
        }
    
        /*
         * 格式化
         * @param {String} fmt 格式
         * @return {String} 日期
         */
        Date.prototype.format = function (fmt) {
            return Date.format(this, fmt);
        };
    
    
        /*
         * 增加秒
         * @param {Date} date 日期
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.addSecond = function (date, value) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            if (typeof (value) !== "number") {
                throw new Error("type of value is wrong.");
            }
    
            return new Date(date.getTime() + 1000 * value);
        }
    
        /*
         * 增加秒
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.prototype.addSecond = function (value) {
            return Date.addSecond(this, value);
        }
    
    
        /*
         * 增加分钟
         * @param {Date} date 日期
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.addMinutes = function (date, value) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            if (typeof (value) !== "number") {
                throw new Error("type of value is wrong.");
            }
    
            return new Date(date.getTime() + 60 * 1000 * value);
        }
    
        /*
         * 增加分钟
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.prototype.addMinutes = function (value) {
            return Date.addMinutes(this, value);
        }
    
    
        /*
         * 增加小时
         * @param {Date} date 日期
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.addHours = function (date, value) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            if (typeof (value) !== "number") {
                throw new Error("type of value is wrong.");
            }
    
            return new Date(date.getTime() + 60 * 60 * 1000 * value);
        }
    
        /*
         * 增加小时
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.prototype.addHours = function (value) {
            return Date.addHours(this, value);
        }
    
    
        /*
         * 增加天
         * @param {Date} date 日期
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.addDays = function (date, value) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            if (typeof (value) !== "number") {
                throw new Error("type of value is wrong.");
            }
    
            return new Date(date.getTime() + 24 * 60 * 60 * 1000 * value);
        }
    
        /*
         * 增加天
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.prototype.addDays = function (value) {
            return Date.addDays(this, value);
        }
    
    
        /*
         * 增加月份
         * @param {Date} date 日期
         * @param {Number} value 值
         * @return {Date} 日期
         */
        Date.addMonths = function (date, value) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            if (typeof (value) !== "number") {
                throw new Error("type of value is wrong.");
            }
    
            //保存天数
            var day = date.getDate();
    
            var ret = new Date(date.getTime());
            ret.setDate(1); //把日期初始化为1号,计算后重新赋值
            ret.setMonth(date.getMonth() + value);
            ret.setDate(Math.min(day, ret.getDaysInMonth()));
    
            return ret;
        }
    
        /*
         * 增加月份
         * @param {Number} value 增加的值
         * @return {Date} 日期
         */
        Date.prototype.addMonths = function (value) {
            return Date.addMonths(this, value);
        }
    
    
        /*
         * 增加年份
         * @param {Date} date 日期
         * @param {Number} value 增加的值
         * @return {Date} 日期
         */
        Date.addYears = function (date, value) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            if (typeof (value) !== "number") {
                throw new Error("type of value is wrong.");
            }
    
            //保存天数
            var day = date.getDate();
    
            var ret = new Date(date.getTime());
            ret.setDate(1); //把日期初始化为1号,计算后重新赋值
            ret.setYear(date.getFullYear() + value);
            ret.setDate(Math.min(day, ret.getDaysInMonth()));
    
            return ret;
        }
    
        /*
         * 增加年份
         * @param {Number} value 增加的值
         * @return {Date} 日期
         */
        Date.prototype.addYears = function (value) {
            return Date.addYears(this, value);
        }
    
    
        /*
         * 是否是润年
         * @param {Date} date 日期
         * @return {Boolean} 结果
         */
        Date.isLeapYear = function (date) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            var year = date.getFullYear();
            return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
        };
    
        /*
         * 是否是润年
         * @return {Boolean} 结果
         */
        Date.prototype.isLeapYear = function () {
            return Date.isLeapYear(this);
        };
    
    
        /*
         * 获取月份有多少天
         * @param {Date} date 日期
         * @return {Number} 天数
         */
        Date.getDaysInMonth = function (date) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            var month = date.getMonth();
            var days = date.isLeapYear() ? 29 : 28;
            return [31, days, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
        };
    
        /*
         * 获取月份有多少天
         * @return {Number} 天数
         */
        Date.prototype.getDaysInMonth = function () {
            return Date.getDaysInMonth(this);
        };
    
    
        /*
         * 获取日期星期
         * @param {Date} date 日期
         * @param {Array} [array] 返回结果数组,如["星期一","星期二",...]
         * @return {String} 星期字符串
         */
        Date.getDayOfWeek = function (date, array) {
            if (!(date instanceof Date)) {
                throw new Error("type of date is wrong.");
            }
    
            if (array && !(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            array = array || new Array("日", "一", "二", "三", "四", "五", "六");
            var week = date.getDay();
    
            return array[week];
        }
    
        /*
         * 获取日期星期
         * @param {Array} [array] 返回结果数组,如["星期一","星期二",...]
         * @return {String} 星期字符串
         */
        Date.prototype.getDayOfWeek = function (array) {
            return Date.getDayOfWeek(this, array);
        }
    
    
        /*
         * 获取时间间隔
         * @param {Date} startDate 开始日期
         * @param {Date} endDate 结束日期
         * @param {String} [interval] 默认值"T","D":精确到天、"H":精确到小时、"M"精确到分钟、"S"精确到秒、"T"精确到毫秒
         * @return {Number} 间隔数
         */
        Date.getTimeSpan = function (startDate, endDate, interval) {
            if (!(startDate instanceof Date)) {
                throw new Error("type of startDate is wrong.");
            }
    
            if (!(endDate instanceof Date)) {
                throw new Error("type of endDate is wrong.");
            }
    
            if (interval && interval.toUpperCase() !== "D" && interval.toUpperCase() !== "H" && interval.toUpperCase() !== "M" &&
                interval.toUpperCase() !== "S" && interval.toUpperCase() !== "T") {
                throw new Error("interval is wrong.");
            }
    
            interval = interval ? interval.toUpperCase() : 'T';
            var objInterval = { 'D': 1000 * 60 * 60 * 24, 'H': 1000 * 60 * 60, 'M': 1000 * 60, 'S': 1000, 'T': 1 };
            return Math.round((endDate - startDate) / eval('(objInterval.' + interval + ')'));
        }
    
        /*
         * 获取时间间隔
         * @param {Date} endDate 结束日期
         * @param {String} [interval] 默认值"D","D":精确到天、"H":精确到小时、"M"精确到分钟、"S"精确到秒、"T"精确到毫秒
         * @return {Number} 间隔数
         */
        Date.prototype.getTimeSpan = function (endDate, interval) {
            return Date.getTimeSpan(this, endDate, interval);
        }
    
        //#endregion
    
        //#region String对象相关扩展
    
        /*
         * Json日期字符串转换成日期 
         * 格式一:2017-01-13T17:25:20.869212 或 2017-01-13T17:25:20.869212+08:00
         * 格式二:/Date(12321212111)/
         * 格式三:yyyy/MM/dd、yyyy-MM-dd 等
         * @param {String} dateString 日期字符串
         * @return {Date} 日期
         */
        String.jsonStrToDate = function (dateString) {
            if (typeof (dateString) !== "string" && !(dateString instanceof String)) {
                throw new Error("type of dateString is wrong.");
            }
    
            if (dateString.indexOf('Date') >= 0) {
                return new Date(parseInt(dateString.substring(6, dateString.length - 2)));
            }
    
            if (dateString.indexOf('T') >= 0) {
                if (dateString.indexOf('+') < 0) {
                    dateString += "+08:00";
                }
    
                return new Date(dateString);
            }
            else {
                if (Date.parse(dateString)) {
                    return new Date(dateString);
                }
                else {
                    return new Date(dateString.replace(/-/gi, "\/"));
                }
            }
        }
    
        /*
         * Json日期字符串转换成日期 
         * 格式一:2017-01-13T17:25:20.869212 或 2017-01-13T17:25:20.869212+08:00
         * 格式二:/Date(12321212111)/
         * 格式三:yyyy/MM/dd、yyyy-MM-dd 等
         * @return {Date} 日期
         */
        String.prototype.jsonStrToDate = function () {
            return String.jsonStrToDate(this);
        }
    
    
        /*
         * 去除字符串头部空格或指定字符 
         * @param {String} str 字符串
         * @param {String} [c] 指定字符(字符串)
         * @return {String} 字符串
         */
        String.trimStart = function (str, c) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (c && typeof (c) !== "string") {
                throw new Error("type of c is wrong.");
            }
    
            var regExp;
            if (!c) {
                regExp = new RegExp(/^\s*/);
            }
            else {
                regExp = new RegExp("^" + c);
            }
    
            return str.replace(regExp, '');
        }
    
        /*
         * 去除字符串头部空格或指定字符 
         * @param {String} [c] 指定字符(字符串)
         * @return {String} 字符串
         */
        String.prototype.trimStart = function (c) {
            return String.trimStart(this, c);
        }
    
    
        /*
         * 去除字符串尾部空格或指定字符 
         * @param {String} str 字符串
         * @param {String} [c] 指定字符(字符串)
         * @return {String} 字符串
         */
        String.trimEnd = function (str, c) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (c && typeof (c) !== "string") {
                throw new Error("type of c is wrong.");
            }
    
            var regExp;
            if (!c) {
                regExp = new RegExp(/\s*$/);
            }
            else {
                regExp = new RegExp(c + "$");
            }
    
            return str.replace(regExp, '');
        }
    
        /*
         * 去除字符串尾部空格或指定字符 
         * @param {String} [c] 指定字符(字符串)
         * @return {String} 字符串
         */
        String.prototype.trimEnd = function (c) {
            return String.trimEnd(this, c);
        }
    
    
        /*
         * 去除字符串首尾空格或指定字符 
         * @param {String} str 字符串
         * @param {String} [c] 指定字符(字符串)
         * @return {String} 字符串
         */
        String.trim = function (str, c) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (c && typeof (c) !== "string") {
                throw new Error("type of c is wrong.");
            }
    
    
            return str.trimStart(c).trimEnd(c);
        }
    
        /*
         * 去除字符串尾部空格或指定字符 
         * @param {String} [c] 指定字符(字符串)
         * @return {String} 字符串
         */
        String.prototype.trim = function (c) {
            return String.trim(this, c);
        }
    
    
        /*
         * 是否由指定字符串开始 
         * @param {String} str 字符串
         * @param {String} s 指定字符串
         * @return {Boolean} 结果
         */
        String.startWith = function (str, s) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (typeof (s) !== "string") {
                throw new Error("type of s is wrong.");
            }
    
            if (s.length > str.length) {
                return false;
            }
    
            return str.substr(0, s.length) === s;
        }
    
        /*
         * 是否由指定字符串开始 
         * @param {String} s 指定字符串
         * @return {Boolean} 结果
         */
        String.prototype.startWith = function (s) {
            return String.startWith(this, s);
        }
    
    
        /*
         * 是否由指定字符串结束
         * @param {String} str 字符串
         * @param {String} s 指定字符串
         * @return {Boolean} 结果
         */
        String.endWith = function (str, s) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (typeof (s) !== "string") {
                throw new Error("type of s is wrong.");
            }
    
            if (s.length > str.length) {
                return false;
            }
    
            return str.substring(str.length - s.length) === s;
        }
    
        /*
         * 是否由指定字符串结束
         * @param {String} s 指定字符串
         * @return {Boolean} 结果
         */
        String.prototype.endWith = function (s) {
            return String.endWith(this, s);
        }
    
    
        /*
         * 是否包含指定字符串
         * @param {String} str 字符串
         * @param {String} s 指定字符串
         * @return {Boolean} 结果
         */
        String.contains = function (str, s) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (typeof (s) !== "string") {
                throw new Error("type of s is wrong.");
            }
    
            return str.indexOf(s) !== -1;
        }
    
        /*
         * 是否包含指定字符串
         * @param {String} s 指定字符串
         * @return {Boolean} 结果
         */
        String.prototype.contains = function (s) {
            return String.contains(this, s);
        }
    
    
        /*
         * 插入指定字符串
         * @param {String} str 字符串
         * @param {String} s 指定字符串
         * @param {Number} [index] 指定位置
         * @return {String} 字符串
         */
        String.insert = function (str, s, index) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (typeof (s) !== "string") {
                throw new Error("type of s is wrong.");
            }
    
            if (index && typeof (index) !== "number") {
                throw new Error("type of index is wrong.");
            }
    
            if (!index) {
                index = 0;
            }
            else if (index > str.length) {
                index = str.length;
            }
    
            return str.substring(0, index) + s + str.substring(index);
        }
    
        /*
         * 插入指定字符串
         * @param {String} s 指定字符串
         * @param {Number} [index] 指定位置
         * @return {String} 字符串
         */
        String.prototype.insert = function (s, index) {
            return String.insert(this, s, index);
        }
    
    
        /*
         * 截取字符串
         * @param {String} str 字符串
         * @param {Number} s 指定长度
         * @param {String} [sign] 替换截取的符号,默认为"..."
         * @return {String} 字符串
         */
        String.cutString = function (str, len, sign) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (typeof (len) !== "number") {
                throw new Error("type of len is wrong.");
            }
    
            if (sign && typeof (sign) !== "string") {
                throw new Error("type of sign is wrong.");
            }
    
            //取得指定长度的字符串
            var _cutString = function (str, len) {
                var strLen = str.length; // 原字符串长度 
                var stringn;// 截取后的字符串
                var flag = "1";
                var lenCount = 0;
                var ret = false;
    
                if (strLen <= len / 2) {
                    stringn = str;
                    ret = true;
                }
    
                if (!ret) {
                    for (var i = 0; i < strLen; i++) {
                        if (_isFull(str.charAt(i))) {
                            lenCount += 2;
                        } else {
                            lenCount += 1;
                        }
    
                        if (lenCount > len) {
                            stringn = str.substring(0, i);
                            ret = true;
                            break;
                        }
                        else if (lenCount == len) {
                            stringn = str.substring(0, i + 1);
                            ret = true;
                            break;
                        }
                    }
                }
    
                if (!ret) {
                    stringn = str;
                }
    
                if (stringn.length == strLen) {
                    flag = "0";
                }
    
                return { "Stringn": stringn, "Flag": flag };
            }
    
            //判断是否为全角
            var _isFull = function (char) {
                for (var i = 0; i < char.strLen; i++) {
                    if ((char.charCodeAt(i) > 128)) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
    
            var _ret = _cutString(str, len);
            return _ret.Flag == "1" ? _ret.Stringn + (sign || "...") : _ret.Stringn + "";
        }
    
        /*
         * 截取字符串
         * @param {Number} s 指定长度
         * @param {String} [sign] 替换截取的符号,默认为"..."
         * @return {String} 字符串
         */
        String.prototype.cutString = function (len, sign) {
            return String.cutString(this, len, sign);
        }
    
    
        /*
         * 格式化
         * @param {String} str 字符串
         * @param {Object|Array} [args] 格式化内容
         * @return {String} 字符串
         */
        String.format = function (str, args) {
            if (typeof (str) !== "string" && !(str instanceof String)) {
                throw new Error("type of str is wrong.");
            }
    
            if (typeof (args) == "object") {
                for (var key in args) {
                    if (args[key] !== null && args[key] !== undefined) {
                        var regExp = new RegExp("\\{" + key + "\\}", "g");
                        str = str.replace(regExp, args[key])
                    };
                }
            }
            else {
                for (var i = 1, max = arguments.length; i < max; i++) {
                    if (arguments[i] !== null && arguments[i] !== undefined) {
                        var regExp = new RegExp("\\{" + (i - 1) + "\\}", 'g');
                        str = str.replace(regExp, arguments[i]);
                    }
                }
            }
    
            return str;
        }
    
        /*
         * 格式化
         * @param {Object|Array} [args] 格式化内容
         * @return {String} 字符串
         */
        String.prototype.format = function (args) {
            return String.format(this, typeof (args) === "object" ? args : arguments);
        }
    
        //#endregion
    
        //#region Array对象相关扩展
    
        /*
         * 获取满足表达式的数组元素索引
         * @param {Array} array 数组对象
         * @param {Function} predicate 表达式
         * @return {Number} 索引,未找到满足表达式的元素时返回-1
         */
        Array.findIndex = function (array, predicate) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (predicate) !== 'function') {
                throw new TypeError('type of predicate is wrong.');
            }
    
            for (var i = 0, len = array.length; i < len; i++) {
                if (predicate.call(arguments[2], array[i], i, array)) {
                    return i;
                }
            }
    
            return -1;
        }
    
        /*
         * 获取满足表达式的数组元素索引
         * @param {Function} predicate 表达式
         * @return {Number} 索引,未找到满足表达式的元素时返回-1
         */
        Array.prototype.findIndex = function (predicate) {
            return Array.findIndex(this, predicate, arguments[1]);
        };
    
    
        /*
         * 是否存在满足表达式的数组元素
         * @param {Array} array 数组对象
         * @param {Function} predicate 表达式
         * @return {Boolean} 结果
         */
        Array.any = function (array, predicate) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (predicate) !== 'function') {
                throw new TypeError('type of predicate is wrong.');
            }
    
            return Array.findIndex(array, predicate, arguments[2]) > -1;
        };
    
        /*
         * 是否存在满足表达式的数组元素
         * @param {Function} predicate 表达式
         * @return {Boolean} 结果
         */
        Array.prototype.any = function (predicate) {
            return Array.any(this, predicate, arguments[1]);
        };
    
    
        /*
         * 获取满足表达式的第一个或默认数组元素
         * @param {Array} array 数组对象
         * @param {Function} predicate 表达式
         * @return {Object} 元素
         */
        Array.firstOrDefault = function (array, predicate) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (predicate) !== 'function') {
                throw new TypeError('type of predicate is wrong.');
            }
    
            var index = Array.findIndex(array, predicate, arguments[2]);
            return index == -1 ? null : array[index];
        }
    
        /*
         * 获取满足表达式的第一个或默认数组元素
         * @param {Function} predicate 表达式
         * @return {Object} 元素
         */
        Array.prototype.firstOrDefault = function (predicate) {
            return Array.firstOrDefault(this, predicate, arguments[1]);
        }
    
    
        /*
         * 获取满足表达式的第一个数组元素
         * @param {Array} array 数组对象
         * @param {Function} predicate 表达式
         * @return {Object} 元素
         */
        Array.find = function (array, predicate) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (predicate) !== 'function') {
                throw new TypeError('type of predicate is wrong.');
            }
    
            return Array.firstOrDefault(array, predicate, arguments[2]);
        }
    
        /*
         * 获取满足表达式的第一个数组元素
         * @param {Function} predicate 表达式
         * @return {Object} 元素
         */
        Array.prototype.find = function (predicate) {
            return Array.find(this, predicate, arguments[1]);
        }
    
    
        /*
         * 筛选满足表达式的数组元素
         * @param {Array} array 数组对象
         * @param {Function} predicate 表达式
         * @return {Array} 数组
         */
        Array.where = function (array, predicate) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (predicate) !== 'function') {
                throw new TypeError('type of predicate is wrong.');
            }
    
            //如果浏览器支持reduce,使用reduce,效率高
            if (typeof (array.reduce) === "function") {
                return array.reduce(function (ret, element, index) {
                    if (predicate.call(arguments[2], element, index, array)) {
                        ret.push(element);
                    }
    
                    return ret;
                }, []);
            }
            else {
                var ret = [];
                for (var i = 0, len = array.length; i < len; i++) {
                    var element = array[i];
                    if (predicate.call(arguments[2], element, i, array)) {
                        ret.push(element);
                    }
                }
    
                return ret;
            }
        }
    
        /*
         * 筛选满足表达式的数组元素
         * @param {Function} predicate 表达式
         * @return {Array} 数组
         */
        Array.prototype.where = function (predicate) {
            return Array.where(this, predicate, arguments[1]);
        }
    
    
        /*
         * 获取满足表达式的数组元素的计数
         * @param {Array} array 数组对象
         * @param {Function} predicate 表达式
         * @return {Number} 计数
         */
        Array.count = function (array, predicate) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (predicate) !== 'function') {
                throw new TypeError('type of predicate is wrong.');
            }
    
            return Array.where(array, predicate, arguments[2]).length;
        }
    
        /*
         * 获取满足表达式的数组元素的计数
         * @param {Function} predicate 表达式
         * @return {Number} 计数
         */
        Array.prototype.count = function (predicate) {
            return Array.count(this, predicate, arguments[1]);
        }
    
    
        /*
         * 获取满足表达式的数组元素的数组
         * @param {Array} array 数组对象
         * @param {Function} predicate 表达式
         * @return {Array} 数组
         */
        Array.findAll = function (array, predicate) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (predicate) !== 'function') {
                throw new TypeError('type of predicate is wrong.');
            }
    
            return Array.where(array, predicate, arguments[2]);
        }
    
        /*
         * 获取满足表达式的数组元素的数组
         * @param {Function} predicate 表达式
         * @return {Array} 数组
         */
        Array.prototype.findAll = function (predicate) {
            return Array.findAll(this, predicate, arguments[1]);
        }
    
    
        /*
         * 获取通过选择器转换的数组
         * @param {Array} array 数组对象
         * @param {Function} selector 选择器
         * @return {Array} 数组
         */
        Array.select = function (array, selector) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (selector) !== 'function') {
                throw new TypeError('type of selector is wrong.');
            }
    
            //如果浏览器支持reduce,使用reduce,效率高
            if (typeof (array.reduce) === "function") {
                return array.reduce(function (ret, element, index) {
                    ret.push(selector.call(arguments[2], element, index, array));
                    return ret;
                }, []);
            }
            else {
                var ret = [];
                for (var i = 0, len = array.length; i < len; i++) {
                    ret.push(selector.call(arguments[2], array[i], i, array))
                }
    
                return ret;
            }
        }
    
        /*
         * 获取通过选择器转换的数组
         * @param {Function} selector 选择器
         * @return {Array} 数组
         */
        Array.prototype.select = function (selector) {
            return Array.select(this, selector, arguments[1]);
        }
    
    
        /*
         * 排序(升序)
         * @param {Array} array 数组对象
         * @param {Function} keySelector key选择器
         * @param {Function} [comparer] 比较器
         * @return {Array} 数组
         */
        Array.orderBy = function (array, keySelector, comparer) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (keySelector) !== 'function') {
                throw new TypeError('type of keySelector is wrong.');
            }
    
            if (comparer && typeof (comparer) !== 'function') {
                throw new TypeError('type of comparer is wrong.');
            }
    
            array.sort(function (x, y) {
                var v1 = keySelector(x)
                var v2 = keySelector(y)
                if (comparer) {
                    return comparer(v1, v2);
                }
                else {
                    return (v1 > v2) ? 1 : -1;
                }
            });
    
            return array;
        }
    
        /*
         * 排序(升序)
         * @param {Array} array 数组对象
         * @param {Function} keySelector key选择器
         * @param {Function} [comparer] 比较器
         * @return {Array} 数组
         */
        Array.prototype.orderBy = function (keySelector, comparer) {
            return Array.orderBy(this, keySelector, comparer);
        }
    
    
        /*
         * 排序(降序)
         * @param {Array} array 数组对象
         * @param {Function} keySelector key选择器
         * @param {Function} [comparer] 比较器
         * @return {Array} 数组
         */
        Array.orderByDescending = function (array, keySelector, comparer) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (keySelector) !== 'function') {
                throw new TypeError('type of keySelector is wrong.');
            }
    
            if (comparer && typeof (comparer) !== 'function') {
                throw new TypeError('type of comparer is wrong.');
            }
    
            array.sort(function (x, y) {
                var v1 = keySelector(x)
                var v2 = keySelector(y)
                if (comparer) {
                    return -comparer(v1, v2);
                }
                else {
                    return (v1 < v2) ? 1 : -1;
                }
            });
    
            return array;
        }
    
        /*
         * 排序(降序)
         * @param {Function} keySelector key选择器
         * @param {Function} [comparer] 比较器
         * @return {Array} 数组
         */
        Array.prototype.orderByDescending = function (keySelector, comparer) {
            return Array.orderByDescending(this, keySelector, comparer);
        }
    
    
        /*
         * 分组
         * @param {Array} array 数组对象
         * @param {Function} keySelector key选择器
         * @return {Array} 分组
         */
        Array.groupBy = function (array, keySelector) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (keySelector) !== 'function') {
                throw new TypeError('type of keySelector is wrong.');
            }
    
            //如果浏览器支持reduce,使用reduce,效率高
            if (typeof (array.reduce) === "function") {
                var keys = [];
                return array.reduce(function (groups, element, index) {
                    var key = JSON.stringify(keySelector.call(arguments[1], element, index, array))
                    var index = keys.findIndex(function (x) { return x === key });
    
                    if (index < 0) {
                        index = keys.push(key) - 1;
                    }
    
                    if (!groups[index]) {
                        groups[index] = [];
                    }
    
                    groups[index].push(element);
                    return groups;
                }, []);
            }
            else {
                var groups = [];
                var keys = [];
                for (var i = 0, len = array.length; i < len; i++) {
                    var key = JSON.stringify(keySelector.call(arguments[1], array[i], i, array));
                    var index = keys.findIndex(function (x) { return x === key });
    
                    if (index < 0) {
                        index = keys.push(key) - 1;
                    }
    
                    if (!groups[index]) {
                        groups[index] = [];
                    }
    
                    groups[index].push(array[i]);
                }
    
                return groups;
            }
        }
    
        /*
         * 分组
         * @param {Function} keySelector key选择器
         * @return {Array} 分组
         */
        Array.prototype.groupBy = function (keySelector) {
            return Array.groupBy(this, keySelector)
        }
    
    
        /*
         * 求和
         * @param {Array} array 数组对象
         * @param {Function} [selector] 选择器
         * @return {Object} 结果
         */
        Array.sum = function (array, selector) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (selector && typeof (selector) !== 'function') {
                throw new TypeError('type of selector is wrong.');
            }
    
            var ret;
            for (var i = 0, len = array.length; i < len; i++) {
                if (i == 0) {
                    if (selector) {
                        ret = selector.call(arguments[2], array[i], i, array);
                    }
                    else {
                        ret = array[i]
                    }
                }
                else {
                    if (selector) {
                        ret += selector.call(arguments[2], array[i], i, array);
                    }
                    else {
                        ret += array[i]
                    }
                }
            }
    
            return ret;
        }
    
        /*
         * 求和
         * @param {Function} [selector] 选择器
         * @return {Array} 结果
         */
        Array.prototype.sum = function (selector) {
            return Array.sum(this, selector, arguments[1]);
        }
    
        /*
         * 包含
         * @param {Array} array 数组对象
         * @param {Number|String} value 值
         * @return {Boolen} 结果
         */
        Array.contains = function (array, value) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            for (var i = 0, len = array.length; i < len; i++) {
                if (array[i] == value) {
                    return true;
                }
            }
    
            return false;
        };
    
        /*
         * 包含
         * @param {Number|String} value 值
         * @return {Boolen} 结果
         */
        Array.prototype.contains = function (value) {
            return Array.contains(this, value);
        }
    
        /*
         * 移除满足表达式的数组元素
         * @param {Array} array 数组对象
         * @param {Function} predicate 表达式
         */
        Array.removeAll = function (array, predicate) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            if (typeof (predicate) !== 'function') {
                throw new TypeError('type of predicate is wrong.');
            }
    
            var index;
            do {
                index = Array.findIndex(array, predicate, arguments[2])
                if (index >= 0) {
                    array.splice(index, 1);
                }
            }
            while (index >= 0);
        }
    
        /*
         * 移除满足表达式的数组元素
         * @param {Function} predicate 表达式
         */
        Array.prototype.removeAll = function (predicate) {
            Array.removeAll(this, predicate, arguments[1]);
        }
    
    
        /*
         * 移除数组元素
         * @param {Array} array 数组对象
         * @param {Object} element 数组元素
         */
        Array.remove = function (array, element) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            var index = Array.findIndex(array, function (x) {
                return x === element;
            });
    
            if (index >= 0) {
                array.splice(index, 1);
                return true;
            }
            else {
                return false;
            }
        }
    
        /*
         * 移除数组元素
         * @param {Object} element 数组元素
         */
        Array.prototype.remove = function (element) {
            return Array.remove(this, element);
        }
    
    
        /*
         * 移除特定索引数组元素
         * @param {Array} array 数组对象
         * @param {Number} index 索引
         */
        Array.removeAt = function (array, index) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            array.splice(index, 1);
        }
    
        /*
         * 移除特定索引数组元素
         * @param {Number} index 索引
         */
        Array.prototype.removeAt = function (index) {
            Array.removeAt(this, index);
        }
    
    
        /*
         * 移除范围数组元素
         * @param {Array} array 数组对象
         * @param {Number} index 开始索引
         * @param {Number} count 删除的个数
         */
        Array.removeRange = function (array, index, count) {
            if (!(array instanceof Array)) {
                throw new Error("type of array is wrong.");
            }
    
            array.splice(index, count);
        }
    
        /*
         * 移除范围数组元素
         * @param {Number} index 开始索引
         * @param {Number} count 删除的个数
         */
        Array.prototype.removeRange = function (index, count) {
            Array.removeRange(this, index, count);
        }
    
        //#endregion
    
        //#region Number对象相关扩展
    
        /* 
         * 加法函数,用来得到精确的加法结果 
         * javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。
         * @param {Number} a 参与计算数
         * @param {Number} b 参与计算数
         * @return {Number} 相对精确结果 
         */
        Number.add = function (a, b) {
            if (typeof (a) !== "number" && !(a instanceof Number)) {
                throw new Error("type of a is wrong.");
            }
    
            if (typeof (b) !== "number") {
                throw new Error("type of b is wrong.");
            }
    
            var c, d, e;
            try {
                c = a.toString().split(".")[1].length;
            } catch (f) {
                c = 0;
            }
            try {
                d = b.toString().split(".")[1].length;
            } catch (f) {
                d = 0;
            }
    
            return e = Math.pow(10, Math.max(c, d)), (Number.mul(a, e) + Number.mul(b, e)) / e;
        }
    
        /* 
         * 加法函数,用来得到精确的加法结果 
         * javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。
         * @param {Number} b 参与计算数
         * @return {Number} 相对精确结果 
         */
        Number.prototype.add = function (b) {
            return Number.add(this, b);
        };
    
    
        /* 
         * 减法函数,用来得到精确的减法结果 
         * javascript的加法结果会有误差,在两个浮点数相减的时候会比较明显。
         * @param {Number} a 参与计算数
         * @param {Number} b 参与计算数
         * @return {Number} 相对精确结果 
         */
        Number.sub = function (a, b) {
            if (typeof (a) !== "number" && !(a instanceof Number)) {
                throw new Error("type of a is wrong.");
            }
    
            if (typeof (b) !== "number") {
                throw new Error("type of b is wrong.");
            }
    
            var c, d, e;
            try {
                c = a.toString().split(".")[1].length;
            } catch (f) {
                c = 0;
            }
            try {
                d = b.toString().split(".")[1].length;
            } catch (f) {
                d = 0;
            }
    
            return e = Math.pow(10, Math.max(c, d)), (Number.mul(a, e) - Number.mul(b, e)) / e;
        }
    
        /* 
         * 减法函数,用来得到精确的减法结果 
         * javascript的加法结果会有误差,在两个浮点数相减的时候会比较明显。
         * @param {Number} b 参与计算数
         * @return {Number} 相对精确结果 
         */
        Number.prototype.sub = function (b) {
            return Number.sub(this, b);
        };
    
    
        /* 
         * 乘法函数,用来得到精确的乘法结果  
         * javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。
         * @param {Number} a 参与计算数
         * @param {Number} b 参与计算数
         * @return {Number} 相对精确结果 
         */
        Number.mul = function (a, b) {
            if (typeof (a) !== "number" && !(a instanceof Number)) {
                throw new Error("type of a is wrong.");
            }
    
            if (typeof (b) !== "number") {
                throw new Error("type of b is wrong.");
            }
    
            var c = 0, d = a.toString(), e = b.toString();
            try {
                c += d.split(".")[1].length;
            } catch (f) { }
            try {
                c += e.split(".")[1].length;
            } catch (f) { }
    
            return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
        }
    
        /* 
         * 乘法函数,用来得到精确的乘法结果  
         * javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。
         * @param {Number} b 参与计算数
         * @return {Number} 相对精确结果 
         */
        Number.prototype.mul = function (b) {
            return Number.mul(this, b);
        };
    
    
        /* 
         * 除法函数,用来得到精确的除法结果   
         * javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显
         * @param {Number} a 参与计算数
         * @param {Number} b 参与计算数
         * @return {Number} 相对精确结果 
         */
        Number.div = function (a, b) {
            if (typeof (a) !== "number" && !(a instanceof Number)) {
                throw new Error("type of a is wrong.");
            }
    
            if (typeof (b) !== "number") {
                throw new Error("type of b is wrong.");
            }
    
            if (b === 0) {
                throw new Error("dividend cannot be 0.");
            }
    
            var c, d, e = 0, f = 0;
            try {
                e = a.toString().split(".")[1].length;
            } catch (g) { }
            try {
                f = b.toString().split(".")[1].length;
            } catch (g) { }
            return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), Number.mul(c / d, Math.pow(10, f - e));
        }
    
        /* 
         * 除法函数,用来得到精确的除法结果   
         * javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显
         * @param {Number} b 参与计算数
         * @return {Number} 相对精确结果 
         */
        Number.prototype.div = function (b) {
            return Number.div(this, b);
        };
    
    
        /*
         * 补零
         * @param {Number} num 数字
         * @param {Number} length 总长度
         * @return {String} 字符串
         */
        Number.addPreZero = function (num, length) {
            if (typeof (num) !== "number" && !(num instanceof Number)) {
                throw new Error("type of num is wrong.");
            }
    
            if (typeof (length) !== "number") {
                throw new Error("type of length is wrong.");
            }
    
            if (length > num.toString().length) {
                return (Array(length).join('0') + num).slice(-length);
            }
            else {
                return num.toString();
            }
        }
    
        /*
         * 补零
         * @param {Number} length 总长度
         * @return {String} 字符串
         */
        Number.prototype.addPreZero = function (length) {
            return Number.addPreZero(this, length);
        }
    
        //#endregion
    
    }())
    

    相关文章

      网友评论

          本文标题:JS常用功能扩展方法,大家要用自己拿

          本文链接:https://www.haomeiwen.com/subject/ercgqqtx.html