UNPKG

utils2

Version:

validator,_,IO,string,date,numer,array

307 lines (306 loc) 9.17 kB
const _ = { /** * 获取变量类型 */ type: function (o) { var _t = typeof o; return (_t === 'object' ? o === null && 'null' || Object.prototype.toString.call(o).slice(8, -1) : _t).toLowerCase(); }, isFunction: function (o) { return 'function' === this.type(o); }, isArray: function (o) { return 'array' === this.type(o); }, isString: function (o) { return 'string' === this.type(o); }, isDate: function (o) { return 'date' === this.type(o); }, isNumber: function (o) { return 'number' === this.type(o); }, isRegExp: function (o) { return 'regexp' === this.type(o); }, isObject: function (o) { return 'object' === typeof o; }, isBoolean: function (o) { return 'boolean' === this.type(o); }, isNull: function (o) { return 'null' === this.type(o); }, isUndefined: function (o) { return 'undefined' === this.type(o); }, isNil: function (o) { return o === null || o === undefined; }, isEmpty: function (o) { return o === '' || this.isNil(o); }, isEmptyObject: function (o) { for (var k in o) { return false; } return true; }, isNaN: function (o) { return Number.isNaN(o); }, isError: function (o) { return 'error' === this.type(o); }, /** * 返回属性数组 */ keys: function (o) { var res = []; for (let k in o) { if (o.hasOwnProperty(k.toString())) { res.push(k); } } return res; }, /** * 过滤字段(返回新的对象) */ pick: function (o, arr) { const res = {}; if (!_.isArray(arr)) { arr = _.keys(arr); } for (let k in o) { if (o.hasOwnProperty(k) && arr.indexOf(k) !== -1) { res[k] = o[k]; } } return res; }, /** * 两个字符串 */ compare: function (str1, str2) { let len1 = str1.length, len2 = str2.length; for (let i = 0; i < len1 && i < len2; i++) { if (str1.charCodeAt(i) !== str2.charCodeAt(i)) { return str1.charCodeAt(i) - str2.charCodeAt(i); } } return len1 - len2; }, /** * 阿拉伯数字转汉语数字 */ num2zh: function (num) { num = num ? num.toString() : ''; var res = ''; var d = { '0': '零', '1': '一', '2': '二', '3': '三', '4': '四', '5': '五', '6': '六', '7': '七', '8': '八', '9': '九' }; for (var i = 0; i < num.length; i++) { res += d[num[i]]; } return res; }, /** * 数组按指定方法排序 */ sortBy: function (arrs, func) { return arrs.sort(func); }, /** * 数组中是否有指定项 */ hasOne: function (arr, func) { for (let i = arr.length - 1; i >= 0; i--) { if (true === func(arr[i])) { return true; } } return false; }, /** * 日期对象操作 */ date: { YEAR: 'Y', QUARTER: 'Q', MONTH: 'M', DATE: 'D', DAY: 'W', HOUR: 'H', MINUTE: 'I', SECOND: 'S', /** * 将时间按指定格式转为字符串 小写都是阿拉伯数字大写是汉字数字 * 格式首字母大写这转为汉字 * @param {date} date 日期对象 * @param {string} Y/y/YY/yy - 年份 一七/17/二零一七/2017 * @param {string} Q/q - 季度 三/3 * @param {string} M/m/mm - 月 九/9/09 * @param {string} W/w - 周 一/1 * @param {string} D/d/dd - 日 九/9/09 * @param {string} H/h/hh - 时 四/4/04 23 * @param {string} I/i - 分 * @param {string} S/s - 秒 * @return {string} - 格式化的字符串 */ format: function (date, format) { var res = format, m = '', stack = [], reg = /\{(\w{1,2})\}/g; while ((m = reg.exec(format)) !== null) { if (stack.indexOf(m[1]) === -1) { stack.push(m[1]); } } for (var i = 0; i < stack.length; i++) { var k = stack[i]; var bZH = (k.charCodeAt(0) > 96) ? false : true; var bLong = (k.length === 2 && k[0].toLowerCase() === k[1].toLowerCase()) ? true : false; var v = null; switch (k[0].toUpperCase()) { case this.YEAR: v = date.getFullYear(); if (bLong === false) { v = v % 100; } break; case this.QUARTER: v = Math.floor((date.getMonth() + 3) / 3); break; case this.MONTH: v = date.getMonth() + 1; break; case this.DAY: v = date.getDay(); break; case this.DATE: v = date.getDate(); break; case this.HOUR: v = date.getHours(); break; case this.MINUTE: v = date.getMinutes(); break; case this.SECOND: v = date.getSeconds(); break; default: break; } //如果指定最小两位长度则个位数前补零 if (bLong && v < 10) { v = '0' + v; } //如果是大写字母则数字转中文 if (bZH) { v = _.num2zh(parseInt(v)); } res = res.replace(new RegExp('{' + k + '}', 'g'), v); } return res; }, /** * 计算指定格式差值 * @param {Date} date - 要比较的日期 * @param {string} [format=s] - 比较的格式 s/i/h/d/w * @return {string} - 返回字符串 */ offset: function (date1, date2, format) { let t0 = date1.getTime(), t1 = date2.getTime(); var res = Math.floor((t0 - t1) / 1000); if (!format) { format = this.SECOND; } switch (format.toUpperCase()) { case this.MINUTE: res /= 60; break; case this.HOUR: res /= 60 * 60; break; case this.DATE: res /= 60 * 60 * 24; break; case this.DAY: res /= 60 * 60 * 24 * 7; break; default: break; } return Math.floor(res * 10) / 10; }, /** * 时间加减计算 * @param {date} date - 日期对象 * @param {int} val - 负数代表日期过去,正数代表日期未来 * @param {int} format - @enum s/i/h/d/w/y 0/1/2/3/4/- 就是没有按月计算的~~ */ compute: function (date, val, format) { var ts = Math.ceil(date.getTime() / 1000); var level = 0; if (!format) { format = this.SECOND; } else { format = format.toUpperCase(); } val = parseInt(val) || 0; switch (format) { case this.SECOND: level = 0; break; case this.MINUTE: level = 1; break; case this.HOUR: level = 2; break; case this.DATE: level = 3; break; case this.DAY: level = 4; break; case this.YEAR: break; default: break; } if (format === this.YEAR) { date.setFullYear(date.getFullYear() + val); } else { if (level > 0) { val *= 60; } if (level > 1) { val *= 60; } if (level > 2) { val *= 24; } if (level > 3) { val *= 7; } date.setTime((ts + val) * 1000); } return date; } } }; module.exports = _;