Files
2026-08-11 22:22:10 +08:00

349 lines
9.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @说明:工具集
* @作者:陈万照
* @公司:山东标梵互动技术有限公司
* @官网:http://biaofun.com/
* @版本:v1.0.0
* @时间:2020年4月28日11:28:13
*/
export default {
/**
* 同步 try catch 的进一步封装处理
* 使用方法:
* let [err, res] = await this.$utils.asyncTasks(Promise函数);
* if(res) 成功
* if(err) 失败
*/
asyncTasks(promise) {
return promise.then(data => {
return [null, data];
}).catch(err => [err]);
},
/**
* 精确判断数据是否是 Object 类型
* @param {Any} val 要判断的数据
* @returns {Boolean} true:是;false:不是;
*/
isObject(val) {
return Object.prototype.toString.call(val) === '[object Object]' && val !== null && val !== undefined;
},
/**
* 判断数据是否是 Array 类型
* @param {Any} val 要判断的数据
* @returns {Boolean} true:是;false:不是;
*/
isArray(val) {
return Object.prototype.toString.call(val) === '[object Array]';
},
/**
* 判断数据是否是 String 类型
* @param {Any} val 要判断的数据
* @returns {Boolean} true:是;false:不是;
*/
isString(val) {
return Object.prototype.toString.call(val) === '[object String]';
},
/**
* 精确判断数据是否是 Date 类型
* @param {Any} val 要判断的数据
* @returns {Boolean} true:是;false:不是;
*/
isDate(val) {
return Object.prototype.toString.call(val) === '[object Date]';
},
/**
* 精确判断数据是否是 Function 类型
* @param {Any} val 要判断的数据
* @returns {Boolean} true:是;false:不是;
*/
isFunction(val) {
return Object.prototype.toString.call(val) === '[object Function]';
},
/**
* 精确判断数据是否是 Number 类型
* @param {Any} val 要判断的数据
* @returns {Boolean} true:是;false:不是;
*/
isNumber(val) {
return Object.prototype.toString.call(val) === '[object Number]';
},
/**
* 精确判断数据是否是 Boolean 类型
* @param {Any} val 要判断的数据
* @returns {Boolean} true:是;false:不是;
*/
isBoolean(val) {
return Object.prototype.toString.call(val) === '[object Boolean]';
},
/**
* 判断 URL 是否是绝对 URL。
* @param {String} url 要判断的 URL
* @return {Boolean} true:是绝对URLfalse:不是绝对URL
*/
isAbsoluteURL(url) {
// 如果 URL 以 “<scheme>//” 或 “//”(协议相对URL)开头,则认为它是绝对的
// RFC 3986 将方案名称定义为以字母开头的字符序列,然后是字母,数字,加号,句点或连字符的任意组合
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
},
/**
* 合并 baseURL 和相对 URL 成一个完整的 URL
* @param {String} baseURL baseURL
* @param {String} relativeURL 相对 URL
* @returns {String} 返回组合后的完整 URL
*/
combineURLs(baseURL, relativeURL) {
return relativeURL && this.isString(relativeURL) && this.isString(baseURL) ? baseURL.replace(/\/+$/, '') + '/' +
relativeURL.replace(/^\/+/, '') : baseURL;
},
/**
* 深度合并对象,只支持合并两个对象,该方法不会改变原有的对象
* @param {Object} FirstOBJ 第一个对象
* @param {Object} SecondOBJ 第二个对象
* @return {Object} 返回深度合并后的对象
*/
deepMargeObject(FirstOBJ, SecondOBJ) {
let ResultOBJ = {};
for (let key in FirstOBJ) {
ResultOBJ[key] = ResultOBJ[key] && ResultOBJ[key].toString() === "[object Object]" ? this.deepMargeObject(ResultOBJ[
key], FirstOBJ[key]) : ResultOBJ[key] = FirstOBJ[key];
}
for (let key in SecondOBJ) {
ResultOBJ[key] = ResultOBJ[key] && ResultOBJ[key].toString() === "[object Object]" ? this.deepMargeObject(ResultOBJ[
key], SecondOBJ[key]) : ResultOBJ[key] = SecondOBJ[key];
}
return ResultOBJ;
},
/**
* 生成指定长度的随机字符串
* @param {Number} min 最小程度
* @param {Number} max 最大长度
* @return {String} 返回生成的字符串
*/
randomString(min, max) {
let returnStr = "",
range = (max ? Math.round(Math.random() * (max - min)) + min : min),
arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
];
for (let i = 0; i < range; i++) {
let index = Math.round(Math.random() * (arr.length - 1));
returnStr += arr[index];
}
return returnStr;
},
/**
* 格式化日期
* @param {Date|String} date 日期或日期字符串
*/
formatDate(date) {
let YYYY = null;
let M = null;
let MM = null;
let D = null;
let DD = null;
let h = null;
let hh = null;
let m = null;
let mm = null;
let s = null;
let ss = null;
let ms = null;
let ms2 = null;
let ms3 = null;
let ms4 = null;
let dt = null;
// 如果 date 是 String 类型
if (date && this.isString(date)) {
// 真机运行时,如果直接用 new Date('YYYY-MM-DD hh:mm:ss') 会报 Invalid Date 错误,所以采用下面的方式创建日期
let dtArr = date.replace(/\//g, '.').replace(/-/g, '.').replace(/:/g, '.').replace(/T/g, ' ').replace(' ', '.').replace(
'Z', '').split('.');
let year = 2020;
let month = 12;
let day = 18;
let hour = 0;
let minute = 0;
let second = 0;
let millisecond = 0;
// 年
if (dtArr.length > 0 && !isNaN(dtArr[0])) {
year = parseInt(dtArr[0]);
}
// 月
if (dtArr.length > 1 && !isNaN(dtArr[1])) {
month = parseInt(dtArr[1]);
}
// 日
if (dtArr.length > 2 && !isNaN(dtArr[2])) {
day = parseInt(dtArr[2]);
}
// 时
if (dtArr.length > 3 && !isNaN(dtArr[3])) {
hour = parseInt(dtArr[3]);
}
// 分
if (dtArr.length > 4 && !isNaN(dtArr[4])) {
minute = parseInt(dtArr[4]);
}
// 秒
if (dtArr.length > 5 && !isNaN(dtArr[5])) {
second = parseInt(dtArr[5]);
}
// 毫秒
if (dtArr.length > 6 && !isNaN(dtArr[6])) {
millisecond = parseInt(dtArr[6]);
}
date = new Date(year, month - 1, day, hour, minute, second, millisecond);
}
// 如果 date 是 Date 类型
if (date && this.isDate(date)) {
YYYY = date.getFullYear();
M = date.getMonth() + 1;
MM = M >= 10 ? M : '0' + M;
D = date.getDate();
DD = D >= 10 ? D : '0' + D;
h = date.getHours();
hh = h >= 10 ? h : '0' + h;
m = date.getMinutes();
mm = m >= 10 ? m : '0' + m;
s = date.getSeconds();
ss = s >= 10 ? s : '0' + s;
ms = date.getMilliseconds();
ms2 = ms;
ms3 = ms;
ms4 = ms;
if (ms < 10) {
ms2 = '0' + ms;
ms3 = '00' + ms;
ms4 = '000' + ms;
} else if (ms < 100) {
ms3 = '0' + ms;
ms4 = '00' + ms;
} else {
ms4 = '0' + ms;
}
}
// 返回的数据对象
let result = {
YYYY: YYYY,
MM: MM,
M: M,
DD: DD,
D: D,
hh: hh,
h: h,
mm: mm,
m: m,
ss: ss,
s: s,
ms: ms,
ms2: ms2,
ms3: ms3,
ms4: ms4,
dt: date,
f1: `${YYYY}-${MM}-${DD}`,
f2: `${YYYY}${M}${D}日`,
f3: `${YYYY}-${M}-${D} ${hh}:${mm}`,
f4: `${h}:${m}:${s}`,
f5: `${MM}-${DD}`,
f6: `${YYYY}-${MM}`,
f7: `${YYYY}${M}月`,
f8: `${h}:${m}`,
f9: `${M}${D}日`,
notes: 'YYYY(年),MM(月,补0),M(月,不补0),DD(日,补0),D(日,不补0),hh(时,补0),h(时,不补0),mm(分,补0),m(分,不补0),ss(秒,补0),s(秒,不补0),ms(毫秒,不补0),ms2(毫秒,补0到2位),ms3(毫秒,补0到3位),ms4(毫秒,补0到4位),其余的f1,f2,... 看格式就知道了!'
};
return result;
},
/**
* 数字转中文
* @param {Number} num 数字
*/
numberToChinese(num) {
if (!/^\d*(\.\d*)?$/.test(num)) return "Number is wrong!";
let AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");
let BB = new Array("", "十", "百", "千", "万", "亿", "点", "");
let a = ("" + num).replace(/(^0*)/g, "").split("."),
k = 0,
re = "";
for (let i = a[0].length - 1; i >= 0; i--) {
switch (k) {
case 0:
re = BB[7] + re;
break;
case 4:
if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
re = BB[4] + re;
break;
case 8:
re = BB[5] + re;
BB[7] = BB[5];
k = 0;
break;
}
if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re;
if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re;
k++;
}
if (a.length > 1) //加上小数部分(如果有小数部分)
{
re += BB[6];
for (let i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
}
return re;
},
/**
* 计算两个经纬度点之间的距离
* @param {Number} lng1 第一个点的经度
* @param {Number} lat1 第一个点的纬度
* @param {Number} lng2 第二个点的经度
* @param {Number} lat2 第二个点的纬度
*/
calcDistance(lng1, lat1, lng2, lat2) {
var radLat1 = lat1 * Math.PI / 180.0;
var radLat2 = lat2 * Math.PI / 180.0;
var a = radLat1 - radLat2;
var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
s = s * 6378.137; // EARTH_RADIUS;
s = Math.round(s * 10000) / 10000;
return s;
},
/**
* 获取数组最小值的下标
* @param {Array} arr 数组
*/
getArrayMixValueIndex(arrar) {
let min = arrar[0];
let index = 0;
for (let i = 0; i < arrar.length; i++) {
if (min > arrar[i]) {
min = arrar[i];
index = i;
}
}
return index;
}
}