js-methods-library
Version:
javascript 实用函数库
1,204 lines (1,104 loc) • 43.5 kB
JavaScript
/**
* @file 函数工具集
* @version 2.0.0
* @author pankzou
* @date 2021-09-23
* @lastModified
* @lastModifiedDate
*/
export default {
install (Vue) {
/*===============** 浏览器地址栏解析 START **===============*/
/**
* 获取地址栏参数,防止 xss 攻击
* @param {string} name - 参数名
* @returns {string} 参数值
* @example
* 地址栏地址:"http://www.123.com/index.html?param1=aaa";
* // aaa
* this.$getQueryString(“param1”);
*/
Vue.prototype.$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, '<').replace(/>/g, '>').replace(/"/g, """).replace(/'/g, "'");//防止xss攻击
} else {
return null;
}
};
/**
* 获取字符串参数,防止 xss 攻击
* @param {string} str - 字符串
* @param {string} name - 参数名
* @returns {string} 参数值
* @example
* // aaa
* this.getParamString("http://www.123.com/index.html?param1=aaa",'param1');
*/
Vue.prototype.$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, '<').replace(/>/g, '>').replace(/"/g, """).replace(/'/g, "'");//防止xss攻击
}
}
return null; //返回参数值
};
/**
* 获取地址栏#后面的值
* @example
* 地址栏地址:"http://www.123.com/index.html#bbb";
* // bbb
* this.getRequestString();
*/
Vue.prototype.$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
* this.getRequestString(1);
* // a
* this.getRequestString(1);
* // a.html
* this.getRequestString(2);
* // www.123.com/a.html
* this.getRequestString(3);
* // www.123.com/a
* this.getRequestString(4);
*/
Vue.prototype.$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"
* this.linkEncodeURI("http://www.123.com/index.html?param1=首页");
*/
Vue.prototype.$linkEncodeURI = function (url) {
return encodeURI(url);
};
/**
* 解码地址
* @param {string} url - 地址
* @returns {string} 解码后的地址
* @example
* // "http://www.123.com/index.html?param1=首页"
* this.linkDecodeURI("http://www.123.com/index.html?param1=%E9%A6%96%E9%A1%B5");
*/
Vue.prototype.$linkDecodeURI = function (url) {
return decodeURI(url);
};
/*===============** 浏览器地址栏解析 END **===============*/
/*===============** 浏览器跳转 START **===============*/
/**
* 页面跳转(loading)
* @param {string} url - 跳转地址
* @param {object} [params] - 附带参数
* @param {object} [loc=window.location] - 当前页面(location) 或者 父页面(parent.location)
* @example
* this.forward('http://www.baidu.com', {a: 1, b: 2}, parent.location);
* this.forward('http://www.baidu.com', {a: 1, b: 2});
*/
Vue.prototype.$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
* this.openWindow('http://www.baidu.com', {a: 1, b: 2}, );
* this.openWindow('http://www.baidu.com', {a: 1, b: 2});
*/
Vue.prototype.$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
* this.getFormatDate('2020/12/12 10:10:30');
* // 2020-12-12 10
* this.getFormatDate('2020/12/12 10:10:30','yyyy-MM-dd HH');
*/
Vue.prototype.$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
* this.getFormatDate('2020-12-12 10:10:30');
* // 2020-12-12 10
* this.getFormatDate('2020-12-12 10:10:30','yyyy-MM-dd HH');
*/
Vue.prototype.$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
* this.getFormatDateNow();
*/
Vue.prototype.$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
* this.checkFormatDateToFuture();
*/
Vue.prototype.$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
* this.uid();
*/
Vue.prototype.$uid = function () {
return Date.now() + Math.ceil(Math.random() * 1000)
};
/*===============** 日期时间操作 END **===============*/
/*===============** 字符串、数组操作 START **===============*/
/**
* @desc 判断是否为空
* @param {string} obj - 参数名称
* @returns {boolean} 参数值
* @example
* // true
* this.isEmpty("");
*/
Vue.prototype.$isEmpty = function (obj) {
if (typeof obj === "undefined" || obj === null || obj === "") {
return true;
} else {
return false;
}
};
/**
* @desc 判断是否为空
* @param obj 参数名称
* @returns {boolean} 参数值
* @example
* // false
* this.isEmpty("");
*/
Vue.prototype.$isNotEmpty = function (obj) {
return !this.isEmpty(obj)
};
/**
* @desc 判断对象是否为空
* @param obj 参数名称
* @returns {boolean} 参数值
* @example
* // true
* this.isEmpty("");
*/
Vue.prototype.$isObjEmpty = function (obj) {
if (JSON.stringify(obj) == "{}") {
return true
} else {
return false
}
};
/**
* @desc 判断是否是json字符串
* @param {string} str - 字符串
* @returns {boolean} 否是json字符串
* @example
* // true
* this.isJsonString("{a1:1}");
*/
Vue.prototype.$isJsonString = function (str) {
try {
if (typeof JSON.parse(str) == "object") {
return true;
}
} catch (e) {
}
return false;
};
/**
* @desc 当两个对象有相同的key时,快速赋值
* @param obj1 被赋值的对象
* @param obj2 赋值的对象
* @example
* this.objToValueObj("{a:1,b:2,d:5}","{a:2,b:3,c:4}")
* obj1: {a:2,b:3,d:5}
*/
Vue.prototype.$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]
* this.split('1,2,3,4');
* // [1,2,3,4]
* this.split('1,2,3',',');
*/
Vue.prototype.$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
* // '张三,李四,王五'
* this.join([{k1:'1','k2:'张三'},{k1:'2','k2:'李四'},{k1:'3','k2:'王五'}],',','k2');
* // '张三.李四.王五'
* this.join([{k1:'1','k2:'张三'},{k1:'2','k2:'李四'},{k1:'3','k2:'王五'}],'.','k2');
* // '张三,李四,王五'
* this.join([{k1:'1','k2:'张三'},{k1:'2','k2:'李四'},{k1:'3','k2:'王五'}],',','k2');
* // '1,2,3'
* this.join([{k1:'1','k2:'张三'},{k1:'2','k2:'李四'},{k1:'3','k2:'王五'}],',','k1');
* // '1,2,3'
* this.join(["1","2","3"])
*/
Vue.prototype.$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}
*/
Vue.prototype.$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
*/
Vue.prototype.$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} 结果数组
*/
Vue.prototype.$copyToDeep = function (origin) {
var target = Array.isArray(origin) ? [] : {};
for (var i in origin) {
if (typeof origin[i] === "object") {
// 递归
target[i] = this.copyToDeep(origin[i])
} else {
target[i] = origin[i]
}
}
return target
};
/**
* 两数组交集
* @param arr1
* @param arr2
* @returns {*[]}
* @example
* this.getArrayMixed([1,2,3], [2,3,4]);// [2,3]
*/
Vue.prototype.$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}]
* this.getArrayMajority(arr, 'a', 1);// [{a:1,b:2,c:3},{a:1,b:3,c:4},]
*/
Vue.prototype.$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 {*[]}
*/
Vue.prototype.$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} [] - 替换后的字符串
* this.setCharAt();
*/
Vue.prototype.$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
* this.isPlalindrome('ababbaba');
* // true
*/
Vue.prototype.$isPlalindrome = function (str) {
if (typeof str !== 'string') return false;
return str.split('').reverse().join('') === str;
};
/*===============** 字符串、数组操作 END **===============*/
/*===============** 文件上传与转码 START **===============*/
/**
* 获取图片路径方法
* @param {Object} file - 图片文件对象
* @returns {string} - 图片文件路径
* @example
* this.getObjectURL(fileObject);
*/
Vue.prototype.$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
* this.getFormData();
* this.getFormData('formName字符串');
*/
Vue.prototype.$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
* this.convertBlob('base64字符串');
*/
Vue.prototype.$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
* this.fileSize(2048);
*/
Vue.prototype.$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
* this.fileSuffix(‘a.png’);
*/
Vue.prototype.$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
* this.fileSuffixType(‘.png’);
*/
Vue.prototype.$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
* this.fileType(‘a.png’);
*/
Vue.prototype.$fileType = function (fileName) {
var fileSuffix = this.fileSuffix(fileName);
return this.fileSuffixType(fileSuffix);
};
/*===============** 文件上传与转码 END **===============*/
/*===============** 本地存储 START **===============*/
/**
* 设置 localStorage
* @param {string} name - 名称
* @content {object} content - 值
* @example
* this.setLocal("myLocal","myLocalVal");
*/
Vue.prototype.$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
* this.getLocal("myLocal");
*/
Vue.prototype.$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
* this.removeLocal("myLocal");
*/
Vue.prototype.$removeLocal = function (name) {
if (!name) {
return;
}
window.localStorage.removeItem(name);
};
/**
* 设置 sessionStorage
* @param {string} name - 名称
* @content {object} content - 值
* @example
* this.setSession("mySession","mySessionVal");
*/
Vue.prototype.$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
* this.getSession("mySession");
*/
Vue.prototype.$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
* this.removeSession("mySession");
*/
Vue.prototype.$removeSession = function (name) {
if (!name) {
return;
}
window.sessionStorage.removeItem(name);
};
/*===============** 本地存储 END **===============*/
/*===============** 判断浏览器环境 START **===============*/
/**
* 判断浏览器环境
* browser.isQQBrw && browser.isQQ QQ APP中
* browser.isQQBrw && !browser.isQQ QQ 浏览器中
*/
// 获取运行环境
Vue.prototype.$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终端
};
}();
// 是否在微信中打开
Vue.prototype.$isWeiXin = function () {
var ua = navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == "micromessenger") { // 在微信中打开
return true;
} else {
return false;
}
}();
// 是否在QQ APP打开
Vue.prototype.$isQQ = function () {
var ua = navigator.userAgent.toLowerCase();
if (ua.match(/ QQ/i) == " qq") { // QQ APP中才有的标识
return true;
} else {
return false;
}
}();
// 是否在QQ APP和QQ浏览器中打开
Vue.prototype.$isQQBrw = function () {
var u = navigator.userAgent;
if (u.indexOf('MQQBrowser') > -1) { // QQ APP和 QQ浏览器中都有的标识
return true;
} else {
return false;
}
}();
// 是否在新浪微博客户端打开
Vue.prototype.$isWeiBo = function () {
var ua = navigator.userAgent.toLowerCase();
if (ua.match(/WeiBo/i) == "weibo") { // 在新浪微博客户端打开
return true;
} else {
return false;
}
}();
/*===============** 判断浏览器环境 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}]}
* this.transData(data,'id','pid','children');
*/
Vue.prototype.$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'}
* this.modifyArrayFeild(Arrydata, keymap);
* [{label:'Lily',value:18},{label:'BKqq',value:22}]
*/
Vue.prototype.$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}
*/
Vue.prototype.$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 this.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: ''}
* this.dto2entity(dto, en)
* console.log(en)
*/
Vue.prototype.$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(this.getDesc('id'))
*/
Vue.prototype.$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(this.getDescDate('createTime'))
*/
Vue.prototype.$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}
*/
Vue.prototype.$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 **===============*/
}
}