UNPKG

js-methods-library

Version:

javascript 实用函数库

1,208 lines (1,106 loc) 42.8 kB
/** * @file 函数工具集 * @version 2.0.0 * @author pankzou * @date 2021-09-23 * @lastModified * @lastModifiedDate */ ;(function (window, $) { var Tools = { /*===============** 浏览器地址栏解析 START **===============*/ /** * 获取地址栏参数,防止 xss 攻击 * @param {string} name - 参数名 * @returns {string} 参数值 * @example * 地址栏地址:"http://www.123.com/index.html?param1=aaa"; * // aaa * Tools.getQueryString(“param1”); */ getQueryString: function (name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) { return decodeURI(r[2]).replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, "&quot;").replace(/'/g, "&#039;");//防止xss攻击 } else { return null; } }, /** * 获取字符串参数,防止 xss 攻击 * @param {string} str - 字符串 * @param {string} name - 参数名 * @returns {string} 参数值 * @example * // aaa * Tools.getParamString("http://www.123.com/index.html?param1=aaa",'param1'); */ getParamString: function (str, name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象 if (str.split("?").length > 1) { var r = str.split("?")[1].match(reg); //匹配目标参数 if (r != null) { return decodeURI(r[2]).replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, "&quot;").replace(/'/g, "&#039;");//防止xss攻击 } } return null; //返回参数值 }, /** * 获取地址栏#后面的值 * @example * 地址栏地址:"http://www.123.com/index.html#bbb"; * // bbb * Tools.getRequestString(); */ getRequestString: function () { var str = window.location.href; var num = str.indexOf("#"); if (num === -1) { return "" } else { str = str.substr(num + 1); return str; } }, /** * 获取 url 的 htm 页面名称 * @param {number} [type=undefined] - 获取类型 * type = 1,只获取页面名称,不带 suffix 后缀 * type = 2,取页面名称,同时带 suffix 后缀 * type = 3,获取 suffix 父级路径与 suffix 名称,同时带 suffix 后缀 * type = 4,获取 suffix 父级路径与 suffix 名称,不带 suffix 后缀 * type = undefined,type 没有值,什么也不传,获取 suffix 父级路径与当前 suffix 页面名称,不带 suffix 后缀 * @param {string} [suffix] - 页面后缀 * @example * 地址栏地址:"http://www.123.com/a.html"; * // www.123.com/a * Tools.getRequestString(1); * // a * Tools.getRequestString(1); * // a.html * Tools.getRequestString(2); * // www.123.com/a.html * Tools.getRequestString(3); * // www.123.com/a * Tools.getRequestString(4); */ getUrlHtml: function (type, suffix) { // 获取url地址 var tsHref = window.location.href; suffix = suffix || 'html' var tsMainText = ""; if (type == 1) { // 获取地址最后一个“/”的下标 var tsIndexOf = tsHref.lastIndexOf("/"); // 获取地址“/”之后的的内容 var tsIndexText = tsHref.substring(tsIndexOf + 1); // 获取地址 suffix 的下标 var tsHtmlBeforeText = tsIndexText.indexOf(suffix); // 获取 “/”到 suffix 之间的内容 tsMainText = tsIndexText.substring(0, tsHtmlBeforeText); } else if (type == 2) { // 获取地址“/”的下标 var tsIndexOf = tsHref.lastIndexOf("/"); // 获取地址“/”之后的的内容 var tsIndexText = tsHref.substring(tsIndexOf + 1); tsMainText = tsIndexText; } else if (type == 3) { // 获取地址中倒数二个“/”下标的位置的之后的内容 var urlParents = tsHref.substr(tsHref.lastIndexOf('/', tsHref.lastIndexOf('/') - 1) + 1); tsMainText = urlParents } else if (type == 4) { // 获取地址中倒数二个“/”的下标之后的内容 var urlParents = tsHref.substr(tsHref.lastIndexOf('/', tsHref.lastIndexOf('/') - 1) + 1); // 取到倒数二个“/”的下标的位置和 suffix 之间的内容 var beforeHtml = urlParents.indexOf(suffix); if (beforeHtml == -1) { tsMainText = urlParents; } else { tsMainText = urlParents.substring(0, beforeHtml); } } else { var urlParents = tsHref.substr(tsHref.lastIndexOf('/', tsHref.lastIndexOf('/') - 1) + 1); var beforeHtml = urlParents.indexOf(suffix); if (beforeHtml == -1) { tsMainText = urlParents; } else { tsMainText = urlParents.substring(0, beforeHtml); } } return tsMainText; }, /** * 编码地址 * @param {string} url - 地址 * @returns {string} 编码后的地址 * @example * // "http://www.123.com/index.html?param1=%E9%A6%96%E9%A1%B5" * Tools.linkEncodeURI("http://www.123.com/index.html?param1=首页"); */ linkEncodeURI: function (url) { return encodeURI(url); }, /** * 解码地址 * @param {string} url - 地址 * @returns {string} 解码后的地址 * @example * // "http://www.123.com/index.html?param1=首页" * Tools.linkDecodeURI("http://www.123.com/index.html?param1=%E9%A6%96%E9%A1%B5"); */ linkDecodeURI: function (url) { return decodeURI(url); }, /*===============** 浏览器地址栏解析 END **===============*/ /*===============** 浏览器跳转 START **===============*/ /** * 页面跳转(loading) * @param {string} url - 跳转地址 * @param {object} [params] - 附带参数 * @param {object} [loc=window.location] - 当前页面(location) 或者 父页面(parent.location) * @example * Tools.forward('http://www.baidu.com', {a: 1, b: 2}, parent.location); * Tools.forward('http://www.baidu.com', {a: 1, b: 2}); */ forward: function (url, params, loc) { // 默认当前页面跳转 loc = loc || window.location; // 拼接参数 if (params) { params = $.param(params); if (url.indexOf('?') === -1) { url = url + '?' + params; } else { url = url + '&' + params; } } // 跳转 loc.href = url; }, /** * 打开窗口 * @param {string} url - 跳转地址 * @param {object} [params] - 附带参数 * @param {string} [target=] - 窗口打开位置 * @example * Tools.openWindow('http://www.baidu.com', {a: 1, b: 2}, ); * Tools.openWindow('http://www.baidu.com', {a: 1, b: 2}); */ openWindow: function (url, params, target) { target = target || "_blank"; // 拼接参数 if (params) { params = $.param(params); if (url.indexOf('?') === -1) { url = url + '?' + params; } else { url = url + '&' + params; } } window.open(url, target) }, /*===============** 浏览器跳转 END **===============*/ /*===============** 日期时间操作 SATRT **===============*/ /** * 日期格式化(日期对象) * @param {String} date - 日期对象 * @param {String} [fmt=‘yyyy-MM-dd’] - 格式化格式 * @returns {String} - 格式化后日期 * @example * // 2020-12-12 * Tools.getFormatDate('2020/12/12 10:10:30'); * // 2020-12-12 10 * Tools.getFormatDate('2020/12/12 10:10:30','yyyy-MM-dd HH'); */ formatDate: function (date, fmt) { if (!fmt) { fmt = "yyyy-MM-dd" } date = new Date(date) if (date) { var o = { "M+": date.getMonth() + 1,// 月份 "d+": date.getDate(),// 日 "H+": date.getHours(),// 小时 "m+": date.getMinutes(),// 分 "s+": date.getSeconds(),// 秒 "q+": Math.floor((date.getMonth() + 3) / 3), // 季度 "S": date.getMilliseconds()// 毫秒 }; if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - 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]) : (("00" + o[k]).substr(("" + o[k]).length))); } } return fmt; } else { return ""; } }, /** * 日期格式化(yyyy-MM-dd HH:mm:ss 格式的日期) * @param {String} date - 日期(yyyy-MM-dd HH:mm:ss) * @param {String} [fmt=‘yyyy-MM-dd’] - 格式化格式 * @returns {String} - 格式化后日期 * @example * // 2020-12-12 * Tools.getFormatDate('2020-12-12 10:10:30'); * // 2020-12-12 10 * Tools.getFormatDate('2020-12-12 10:10:30','yyyy-MM-dd HH'); */ getFormatDate: function (date, fmt) { if (!fmt) { fmt = "yyyy-MM-dd" } var fullDate = new Date(date.replace(/-/g, '/')); return this.formatDate(fullDate, fmt) }, /** * 获取当前日期并格式化 * @param {String} [fmt=‘yyyy-MM-dd’] - 格式化格式 * @returns {String} - 格式化后日期 * @example * // 2020-07-07 * Tools.getFormatDateNow(); */ getFormatDateNow: function (fmt) { if (!fmt) { fmt = "yyyy-MM-dd" } var fullDate = new Date(); return this.formatDate(fullDate, fmt) }, /** * 比较当前与指定时间是否超过num个月 * @param {String} date - 日期对象 * @param {String} - 相差月数 * @returns {} - true or false * @example * // 2020-07-07 * Tools.checkFormatDateToFuture(); */ checkFormatDateToFuture: function (date, num) { var begintime = this.getFormatDateNow(); var endtime = date; if (!endtime) { return true; } var time1 = new Date(begintime).getTime(); var time2 = new Date(endtime).getTime(); if (begintime == '') { return false; } if (endtime == '') { return false; } if (time1 > time2) { // 开始时间不能大于结束时间 return true; } //判断时间跨度是否大于num个月 var arr1 = begintime.split('-'); var arr2 = endtime.split('-'); arr1[1] = parseInt(arr1[1]); arr1[2] = parseInt(arr1[2]); arr2[1] = parseInt(arr2[1]); arr2[2] = parseInt(arr2[2]); var flag = true; if (arr1[0] == arr2[0]) {//同年 if (arr2[1] - arr1[1] > num) { //月间隔超过num个月 flag = false; } else if (arr2[1] - arr1[1] == num) { //月相隔num个月,比较日 if (arr2[2] > arr1[2]) { //结束日期的日大于开始日期的日 flag = false; } } } else { //不同年 if (arr2[0] - arr1[0] > 1) { flag = false; } else if (arr2[0] - arr1[0] == 1) { if (arr1[1] < 10) { //开始年的月份小于10时,不需要跨年 flag = false; } else if (arr1[1] + num - arr2[1] < 12) { //月相隔大于num个月 flag = false; } else if (arr1[1] + num - arr2[1] == 12) { //月相隔num个月,比较日 if (arr2[2] > arr1[2]) { //结束日期的日大于开始日期的日 flag = false; } } } } if (!flag) { // 时间跨度超过num个月 return false; } // 时间跨度小于num个月 return true; }, /** * 生成唯一ID,时间戳加随机数 * @returns {number} - 唯一ID * @example * // 1594087879941 * Tools.uid(); */ uid: function () { return Date.now() + Math.ceil(Math.random() * 1000) }, /*===============** 日期时间操作 END **===============*/ /*===============** 字符串、数组操作 START **===============*/ /** * @desc 判断是否为空 * @param {string} obj - 参数名称 * @returns {boolean} 参数值 * @example * // true * Tools.isEmpty(""); */ isEmpty: function (obj) { if (typeof obj === "undefined" || obj === null || obj === "") { return true; } else { return false; } }, /** * @desc 判断是否为空 * @param obj 参数名称 * @returns {boolean} 参数值 * @example * // false * Tools.isEmpty(""); */ isNotEmpty: function (obj) { return !this.isEmpty(obj) }, /** * @desc 判断对象是否为空 * @param obj 参数名称 * @returns {boolean} 参数值 * @example * // true * Tools.isEmpty(""); */ isObjEmpty: function (obj) { if (JSON.stringify(obj) == "{}") { return true } else { return false } }, /** * @desc 判断是否是json字符串 * @param {string} str - 字符串 * @returns {boolean} 否是json字符串 * @example * // true * Tools.isJsonString("{a1:1}"); */ isJsonString: function (str) { try { if (typeof JSON.parse(str) == "object") { return true; } } catch (e) { } return false; }, /** * @desc 当两个对象有相同的key时,快速赋值 * @param obj1 被赋值的对象 * @param obj2 赋值的对象 * @example * Tools.objToValueObj("{a:1,b:2,d:5}","{a:2,b:3,c:4}") * obj1: {a:2,b:3,d:5} */ objToOtherObj: function (obj1, obj2) { Object.keys(obj1).forEach(function (key) { if (obj2[key]) { obj1[key] = obj2[key] } }) }, /** * 将字符串拆分成数组 * @param {string} str - 字符串 * @param {string} [separator=','] - 分隔符 * @returns {Array} - 数组 * @example * // [1,2,3,4] * Tools.split('1,2,3,4'); * // [1,2,3,4] * Tools.split('1,2,3',','); */ split: function (str, separator) { if (str) { separator = separator || ','; return str.split(separator); } else { return null } }, /** * 将数组拼装成字符串 * @param {Array} str - 数组 * @param {string} key - 作为分隔的 key,当分隔key存在时,separator必传 * @param {string} [separator=','] - 分隔符 * @returns {string} - 字符串 * @example * // '张三,李四,王五' * Tools.join([{k1:'1','k2:'张三'},{k1:'2','k2:'李四'},{k1:'3','k2:'王五'}],',','k2'); * // '张三.李四.王五' * Tools.join([{k1:'1','k2:'张三'},{k1:'2','k2:'李四'},{k1:'3','k2:'王五'}],'.','k2'); * // '张三,李四,王五' * Tools.join([{k1:'1','k2:'张三'},{k1:'2','k2:'李四'},{k1:'3','k2:'王五'}],',','k2'); * // '1,2,3' * Tools.join([{k1:'1','k2:'张三'},{k1:'2','k2:'李四'},{k1:'3','k2:'王五'}],',','k1'); * // '1,2,3' * Tools.join(["1","2","3"]) */ join: function (arr, separator, key) { separator = separator || ','; if (arr) { if (arr && key) { var keysArr = []; for (var i = 0, len = arr.length; i < len; i++) { keysArr.push(arr[i][key]); } return keysArr.join(separator); } else { return arr.join(separator) } } else { return '' } }, /** * 字符串模糊匹配 * @param string * @param keyWord * @returns {boolean} */ stringMatching: function (string, keyWord) { var reg = new RegExp(keyWord); if (string.match(reg)) { return true } else { return false } }, /** * 将数组拼装成数组 * @param {Array} str - 数组 * @param {string} key - 作为分隔的 key * @returns {Array} - 数组 * @example */ joinKey: function (arr, key) { if (arr && key) { var keysArr = []; for (var i = 0, len = arr.length; i < len; i++) { keysArr.push(arr[i][key]); } return keysArr; } else { return [] } }, /** * 数组对象多层拷贝,深拷贝 * @param origin 源数组 * @returns {target} 结果数组 */ copyToDeep: function (origin) { var target = Array.isArray(origin) ? [] : {}; for (var i in origin) { if (typeof origin[i] === "object") { // 递归 target[i] = Tools.copyToDeep(origin[i]) } else { target[i] = origin[i] } } return target }, /** * 两数组交集 * @param arr1 * @param arr2 * @returns {*[]} * @example * Tools.getArrayMixed([1,2,3], [2,3,4]);// [2,3] */ getArrayMixed: function (arr1, arr2) { const map = {}; const ret = []; for (let i = 0; i < arr1.length; i++) { map[arr1[i]] = true; } for (let i = 0; i < arr2.length; i++) { if (map[arr2[i]]) { ret.push(arr2[i]) map[arr2[i]] = false } } return ret; }, /** * 取出数组中,某个属性相同的项组成新的集合 * @param arr * @param key * @param value * @returns {*[]} * @example * arr = [{a:1,b:2,c:3},{a:1,b:3,c:4},{a:2,b:4,c:6}] * Tools.getArrayMajority(arr, 'a', 1);// [{a:1,b:2,c:3},{a:1,b:3,c:4},] */ getArrayMajority: function (arr, key, value) { const ret = []; for (let i = 0; i < arr.length; i++) { if (arr[i][key] == value) { ret.push(arr[i]) } } return ret }, /** * 利用 map 进行数组去重 * @param arr * @returns {*[]} */ arrayDeDuplication: function (arr) { // 创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。 let map = new Map(); let ret = []; for (let i = 0, len = arr.length; i < len; i++) { if (map.has(arr[i])) { // 判断是否存在该key值 map.set(arr[i], true); } else { map.set(arr[i], false); ret.push(arr[i]) } } return ret; }, /** * 替换指定位置的字符串 * @param {string} str - 源字符串 index 索引 char 替换字符 * @returns {string} [] - 替换后的字符串 * Tools.setCharAt(); */ setCharAt: function (str, index, chr) { if (index > str.length - 1) return str; return str.substr(0, index) + chr + str.substr(index + 1); }, /** * 判断输入是不是回文字符串 * @param str * @returns {boolean} * @example * Tools.isPlalindrome('ababbaba'); * // true */ isPlalindrome: function (str) { if (typeof str !== 'string') return false; return str.split('').reverse().join('') === str; }, /*===============** 字符串、数组操作 END **===============*/ /*===============** 文件上传与转码 START **===============*/ /** * 获取图片路径方法 * @param {Object} file - 图片文件对象 * @returns {string} - 图片文件路径 * @example * Tools.getObjectURL(fileObject); */ getObjectURL: function (file) { var url = null; if (window.createObjectURL != undefined) { // basic url = window.createObjectURL(file); } else if (window.URL != undefined) { // mozilla(firefox) url = window.URL.createObjectURL(file); } else if (window.webkitURL != undefined) { // webkit or chrome url = window.webkitURL.createObjectURL(file); } return url; }, /** * 获取formData对象 * @param {string} [form] - form选择器 * @returns {Object} - formData对象 * @example * Tools.getFormData(); * Tools.getFormData('formName字符串'); */ getFormData: function (form) { var isNeedShim = ~navigator.userAgent.indexOf('Android') && ~navigator.vendor.indexOf('Google') && !~navigator.userAgent.indexOf('Chrome') && navigator.userAgent.match(/AppleWebKit\/(\d+)/).pop() <= 534; if (form) { return isNeedShim ? new FormDataShim(form) : new FormData(form); } else { return isNeedShim ? new FormDataShim() : new FormData(); } }, /** * base64转换blob * @param {string} base64 - base64 * @returns {Object} - Blob * @example * Tools.convertBlob('base64字符串'); */ convertBlob: function (base64) { // 解码base64 var byteString = atob(base64.split(',')[1]); var mimeString = base64.split(',')[0].split(':')[1].split(';')[0]; // 类型数组 var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], { type: mimeString }); }, /** * 获取文件后缀名大小(KB) * @param {number} size - 文件大小(BIT) * @returns {number} 文件大小(KB) * @example * // 2 * Tools.fileSize(2048); */ fileSize: function (size) { var fileSize = size / 1024; if (fileSize < 1) { // 小于1KB,取三位小数 fileSize = Math.round(fileSize * 1000) / 1000; } else { // 大于2KB,取一位小数 fileSize = Math.round(fileSize * 10) / 10; } return fileSize; }, /** * 获取文件后缀名 * @param {string} fileName - 文件名称 * @returns {string} 文件后缀名 * @example * // .png * Tools.fileSuffix(‘a.png’); */ fileSuffix: function (fileName) { if (fileName) { var index1 = fileName.lastIndexOf("."); var index2 = fileName.length; var suffix = fileName.substring(index1 + 1, index2);//后缀名 return suffix.toLowerCase(); } else { return ''; } }, /** * 获取文件类型 * @param {string} fileSuffix - 文件后缀名 * @returns {string} 文件类型 * @example * // image * Tools.fileSuffixType(‘.png’); */ fileSuffixType: function (fileSuffix) { var img = ['.png', '.jpg', '.jpeg'], word = ['doc', 'docx'], excel = ['xls', 'xlsx'], rar = ['rar', 'zip'], pdf = ['pdf']; if (img.indexOf(fileSuffix) !== -1) { return 'image'; } else if (word.indexOf(fileSuffix) !== -1) { return 'word'; } else if (excel.indexOf(fileSuffix) !== -1) { return 'excel'; } else if (rar.indexOf(fileSuffix) !== -1) { return 'rar'; } else if (pdf.indexOf(fileSuffix) !== -1) { return 'pdf'; } else { return ''; } }, /** * 获取文件类型 * @param {string} fileName - 文件名称 * @returns {string} 文件类型 * @example * // image * Tools.fileType(‘a.png’); */ fileType: function (fileName) { var fileSuffix = this.fileSuffix(fileName); return this.fileSuffixType(fileSuffix); }, /*===============** 文件上传与转码 END **===============*/ /*===============** 本地存储 START **===============*/ /** * 设置 localStorage * @param {string} name - 名称 * @content {object} content - 值 * @example * Tools.setLocal("myLocal","myLocalVal"); */ setLocal: function (name, content) { if (!name) { return; } // if (typeof content !== "string") { // content = JSON.stringify(content); // } content = JSON.stringify(content); window.localStorage.setItem(name, content); }, /** * 获取 localStorage * @param {string} name - 名称 * @example * // myLocalVal * Tools.getLocal("myLocal"); */ getLocal: function (name) { if (!name) { return; } var content = window.localStorage.getItem(name); try { content = JSON.parse(content); return content; } catch (e) { return content; } }, /** * 删除 localStorage * @param {string} name - 名称 * @example * Tools.removeLocal("myLocal"); */ removeLocal: function (name) { if (!name) { return; } window.localStorage.removeItem(name); }, /** * 设置 sessionStorage * @param {string} name - 名称 * @content {object} content - 值 * @example * Tools.setSession("mySession","mySessionVal"); */ setSession: function (name, content) { if (!name) { return; } if (typeof content !== "string") { content = JSON.stringify(content); } window.sessionStorage.setItem(name, content); }, /** * 获取 sessionStorage * @param {string} name - 名称 * @example * // mySessionVal * Tools.getSession("mySession"); */ getSession: function (name) { if (!name) { return; } var content = window.sessionStorage.getItem(name); try { content = JSON.parse(content); return content; } catch (e) { return content; } }, /** * 删除 sessionStorage * @param {string} name - 名称 * @example * Tools.removeSession("mySession"); */ removeSession: function (name) { if (!name) { return; } window.sessionStorage.removeItem(name); }, /*===============** 本地存储 END **===============*/ /*===============** 判断浏览器环境 START **===============*/ /** * 判断浏览器环境 * browser.isQQBrw && browser.isQQ QQ APP中 * browser.isQQBrw && !browser.isQQ QQ 浏览器中 */ // 获取运行环境 versions: function () { var u = navigator.userAgent, app = navigator.appVersion; return { mobile: !!u.match(/AppleWebKit.*Mobile.*/), // 是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), // ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1 // android终端 }; }(), // 是否在微信中打开 isWeiXin: function () { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger") { // 在微信中打开 return true; } else { return false; } }(), // 是否在QQ APP打开 isQQ: function () { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/ QQ/i) == " qq") { // QQ APP中才有的标识 return true; } else { return false; } }(), // 是否在QQ APP和QQ浏览器中打开 isQQBrw: function () { var u = navigator.userAgent; if (u.indexOf('MQQBrowser') > -1) { // QQ APP和 QQ浏览器中都有的标识 return true; } else { return false; } }(), // 是否在新浪微博客户端打开 isWeiBo: function () { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/WeiBo/i) == "weibo") { // 在新浪微博客户端打开 return true; } else { return false; } }(), language: (navigator.browserLanguage || navigator.language).toLowerCase(), /*===============** 判断浏览器环境 END **===============*/ /*===============** 数据结构转换 START **===============*/ /** * json格式转树状结构(最大支持三级) * @param {Object} json数据 * @param {String} id的字符串 * @param {String} 父id的字符串 * @param {Object} children的字符串 * @return {Object} 树形数据 * @example * var data = [{id:1,pid:''},{id:1,pid:''},{id:1,pid:''},{id:11,pid:1},{id:12,pid:1},{id:2,pid:''},{id:21,pid:2}]; * // {"treeDatas":[{"id":1,"pid":"","level":1},{"id":1,"pid":"","level":1},{"id":1,"pid":"","children":[{"id":11,"pid":1,"level":2},{"id":12,"pid":1,"level":2},{"id":11,"pid":1,"level":2},{"id":12,"pid":1,"level":2}],"level":1},{"id":2,"pid":"","children":[{"id":21,"pid":2,"level":2},{"id":21,"pid":2,"level":2}],"level":1}],"treeList":[{"id":1,"pid":"","level":1},{"id":1,"pid":"","level":1},{"id":1,"pid":"","children":[{"id":11,"pid":1,"level":2},{"id":12,"pid":1,"level":2},{"id":11,"pid":1,"level":2},{"id":12,"pid":1,"level":2}],"level":1},{"id":11,"pid":1,"level":2},{"id":12,"pid":1,"level":2},{"id":11,"pid":1,"level":2},{"id":12,"pid":1,"level":2},{"id":2,"pid":"","children":[{"id":21,"pid":2,"level":2},{"id":21,"pid":2,"level":2}],"level":1},{"id":21,"pid":2,"level":2},{"id":21,"pid":2,"level":2}]} * Tools.transData(data,'id','pid','children'); */ transData: function (a, idStr, pidStr, childrenStr) { var r = [], tr = [], hash = {}, id = idStr, pid = pidStr, children = childrenStr; for (var i in a) { hash[a[i][id]] = a[i]; } for (var j in a) { var aVal = a[j], hashVP = hash[aVal[pid]]; if (hashVP) { !hashVP[children] && (hashVP[children] = []); hashVP[children].push(aVal); } else { tr.push(aVal); } } for (var k in tr) { tr[k]["level"] = 1; r.push(tr[k]); for (var m in tr[k][children]) { tr[k][children][m]["level"] = 2; r.push(tr[k][children][m]); for (var n in tr[k][children][m][children]) { tr[k][children][m][children][n]["level"] = 3; r.push(tr[k][children][m][children][n]); for (var i in tr[k][children][m][children][n][children]) { tr[k][children][m][children][n][children][i]["level"] = 4; r.push(tr[k][children][m][children][n][children][i]); } } } } return { treeDatas: tr, treeList: r }; }, /** * 修改数组对象的key * @param {array} arrayData 目标数组 * @param {Object} modifyObj 需要修改的key与原始的kay组成的对象 * @returns {array} * var Arrydata = [{name:'Lily',age:18},{name:'BKqq',age:22}];var keymap = {name:'label', age: 'value'} * Tools.modifyArrayFeild(Arrydata, keymap); * [{label:'Lily',value:18},{label:'BKqq',value:22}] */ modifyArrayFeild: function (arrayData, modifyObj) { // modifyObj 示例 // var keyMap = { // // id: "value", // name: "label", // age: "value" // }; for (var i = 0; i < arrayData.length; i++) { var obj = arrayData[i]; for (var key in obj) { var newKey = modifyObj[key]; if (newKey) { obj[newKey] = obj[key]; delete obj[key]; } } } return arrayData }, /** * 根据最后一个找到整个家族 * @param {array} arr - 数据 * @param {string|number} pid - 待查找的值 * @param {string} idStr - id * @param {string} pIdStr - 父 id * @returns {array} */ getFamilyTree: function (arr, pid, idStr, pIdStr) { // 进行一次变量转换,此处在其它地方使用时可进行删除 for (var i = 0; i < arr.length; i++) { var item = arr[i]; if (item['dictcode'] == pid) { pid = item['id']; } } if (!idStr) { idStr = 'id' } if (!pIdStr) { pIdStr = 'pId' } var temp = []; var forFn = function (arr, pid) { for (var i = 0; i < arr.length; i++) { var item = arr[i]; if (item[idStr] == pid) { temp.push(item); forFn(arr, item[pIdStr]); } } }; forFn(arr, pid); return Tools.join(temp.reverse(), '', 'dictionaryValues'); }, /** * 对象赋值处理,防止污染对象 * @param {Object} dto - 源对象 * @param {Object} entity - 目标对象 * @example * // {a: 0, b: 1, d: ""} * var dto = {a: 0, b: 1, c: 'hahaha'} * var en = {a: '', b: '', d: ''} * Tools.dto2entity(dto, en) * console.log(en) */ dto2entity: function (dto, entity) { for (var key in entity) { // 判断是否有该属性,且属性不能为空才赋值 if (dto.hasOwnProperty(key) && (dto[key] || dto[key] === 0)) { entity[key] = dto[key]; } } }, /*===============** 数据结构转换 END **===============*/ /*===============** 排序方法 START **===============*/ /** * 用途:sort 排序参数处理-降序 * @param {string} prop - 排序的参数 * @example * var arr = [{id:2},{id:1},{id:3}]; * // [{id:1},{id:2},{id:3}] * arr.sort(Tools.getDesc('id')) */ getDesc: function (prop) { return function (obj1, obj2) { var val1 = obj1[prop]; var val2 = obj2[prop]; if (!isNaN(Number(val1)) && !isNaN(Number(val2))) { val1 = Number(val1); val2 = Number(val2); } if (val1 < val2) { return 1; } else if (val1 > val2) { return -1; } else { return 0; } } }, /** * 封装的日期排序方法-降序 * @param {string} prop - 排序的属性名 * @returns {Number} * @example * var arr = [{createTime:2020-02-01 11:34:00},{createTime:2020-01-01 11:34:00},{createTime:2020-08-01 11:34:00}]; * // [{createTime:2020-01-01 11:34:00},{createTime:2020-02-01 11:34:00},{createTime:2020-08-01 11:34:00}] * arr.sort(Tools.getDescDate('createTime')) */ getDescDate: function (prop) { return function (obj1, obj2) { var val1 = obj1[prop] && new Date(obj1[prop].replace(/-/g, '/')).getTime(); var val2 = obj2[prop] && new Date(obj2[prop].replace(/-/g, '/')).getTime(); if (val1 < val2) { return 1; } else if (val1 > val2) { return -1; } else { return 0; } } }, /** * 生成[n,m]的随机整数 * @param minNum * @param maxNum * @returns {number} */ randomNum: function (minNum, maxNum) { switch (arguments.length) { case 1: return parseInt(Math.random() * minNum + 1, 10); break; case 2: return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10); break; default: return 0; break; } }, /*===============** 排序方法 END **===============*/ } window.Tools = Tools; })(window, window.jQuery)