<------------------此贴将记录实际开发中需要的一些常用方法,后期会不断更新---------------------->
目录
1.随机字符串
// 随机字符串
randString: length => {
var text = ['abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '1234567890'];
var rand = function (min, max) {
return Math.floor(Math.max(min, Math.random() * (max + 1)));
};
var len = rand(length, length); // 长度
var pw = '';
for (let i = 0; i < len; i++) {
var strpos = rand(0, 2);
pw += text[strpos].charAt(rand(0, text[strpos].length - 1));
}
return pw;
},
2.图片url转换为file
// 图片url转换为file
setInitImg: (url, callback) => {
let img = url; //这里是淘宝上随便找的一张图片
let _ = util;
let imgRes;
util.getBase64(img, dataURL => {
imgRes = util.dataURLtoFile(dataURL);
callback(imgRes);
});
},
getBase64: (url, callback) => {
//通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片,相比 createElement() 创建 <img> 省去了 append(),也就避免了文档冗余和污染
var Img = new Image(),
dataURL = '';
Img.src = url + '?v=' + Math.random(); // 处理缓存,fix缓存bug,有缓存,浏览器会报错;
Img.setAttribute('crossOrigin', 'Anonymous'); // 解决控制台跨域报错的问题
Img.onload = function () {
//要先确保图片完整获取到,这是个异步事件
var canvas = document.createElement('canvas'), //创建canvas元素
width = Img.width, //确保canvas的尺寸和图片一样
height = Img.height;
canvas.width = width;
canvas.height = height;
canvas.getContext('2d').drawImage(Img, 0, 0, width, height); //将图片绘制到canvas中
dataURL = canvas.toDataURL('image/jpeg'); //转换图片为dataURL
callback ? callback(dataURL) : null; //调用回调函数
};
},
dataURLtoFile: dataurl => {
//将base64转换为文件,dataurl为base64字符串,filename为文件名(必须带后缀名,如.jpg,.png)
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
let filename = util.randString(8) + '.' + mime.split('/')[1];
return new File([u8arr], filename, { type: mime });
},
3.递归部门列表
recursionDepartmentList: data => {
for (let i = 0; i < data.length; i++) {
if (data[i].childList && data[i].childList.length > 0) {
data[i].label = data[i].organName;
data[i].value = data[i].id;
data[i].children = data[i].childList;
util.recursionDepartmentList(data[i].children);
} else {
data[i].label = data[i].organName;
data[i].value = data[i].id;
}
}
}
4.返回时间(年月日)
returnYearMonthDateTime: date => {
let year = date.getFullYear();
let month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;
let dd = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
let time = year + '-' + month + '-' + dd;
return time;
},
// 返回时间(时分秒)
returnHoursMinuteSecondTime: date => {
let hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
let minute = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
let second = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();
let time = hours + ':' + minute + ':' + second;
return time;
},
// 返回实时时间
returnTime: () => {
let date = new Date();
let month = date.getMonth() + 1 > 9 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1);
let hours = date.getHours() > 9 ? date.getHours() : '0' + date.getHours();
let minutes = date.getMinutes() > 9 ? date.getMinutes() : '0' + date.getMinutes();
let seconds = date.getSeconds() > 9 ? date.getSeconds() : '0' + date.getSeconds();
return date.getFullYear() + '-' + month + '-' + date.getDate() + ' ' + hours + ':' + minutes + ':' + seconds;
},
// 时分秒转时间戳
returnTimeStamp: time => {
const date = new Date();
date.setHours(0, 0, 0, 0);
const timestamp = date.getTime();
var s = 0;
var hour = time.split(':')[0];
var min = time.split(':')[1];
var sec = time.split(':')[2];
s = Number(hour * 3600000) + Number(min * 60000) + Number(sec * 1000);
return s + timestamp;
}
5.中文与数字相关
CheckChinese: val => {
var reg = new RegExp('[\\u4E00-\\u9FFF]+', 'g');
return reg.test(val);
},
// 数字转中文
numberToChina: index => {
let chinaArray = ['', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
switch (index) {
case 1:
return chinaArray[1];
case 2:
return chinaArray[2];
case 3:
return chinaArray[3];
case 4:
return chinaArray[4];
case 5:
return chinaArray[5];
case 6:
return chinaArray[6];
case 7:
return chinaArray[7];
case 8:
return chinaArray[8];
case 9:
return chinaArray[9];
case 10:
return chinaArray[10];
default:
return '';
}
},
6.GIS相关计算
// 返回最大经纬度以及最小经纬度
returnMaxMinLngMaxMinLat: data => {
let maxLng = Math.max(...data.map(item => item.coordinate.longitude));
let minLng = Math.min(...data.map(item => item.coordinate.longitude));
let maxLat = Math.max(...data.map(item => item.coordinate.latitude));
let minLat = Math.min(...data.map(item => item.coordinate.latitude));
return { maxLng: maxLng, minLng: minLng, maxLat: maxLat, minLat: minLat };
},
recursionRouter: (menuMap, menuChildList) => {
menuMap.forEach(menu => {
menuChildList.push(menu);
if (menu.childList) {
util.recursionRouter(menu.childList, menuChildList);
}
});
},
// 计算两个经纬度之间的角度(0-360)
getAngle: (lng_a, lat_a, lng_b, lat_b) => {
var a = ((90 - lat_b) * Math.PI) / 180;
var b = ((90 - lat_a) * Math.PI) / 180;
var AOC_BOC = ((lng_b - lng_a) * Math.PI) / 180;
var cosc = Math.cos(a) * Math.cos(b) + Math.sin(a) * Math.sin(b) * Math.cos(AOC_BOC);
var sinc = Math.sqrt(1 - cosc * cosc);
var sinA = (Math.sin(a) * Math.sin(AOC_BOC)) / sinc;
var A = (Math.asin(sinA) * 180) / Math.PI;
var res = 0;
if (lng_b > lng_a && lat_b > lat_a) res = A;
else if (lng_b > lng_a && lat_b < lat_a) res = 180 - A;
else if (lng_b < lng_a && lat_b < lat_a) res = 180 - A;
else if (lng_b < lng_a && lat_b > lat_a) res = 360 + A;
else if (lng_b > lng_a && lat_b == lat_a) res = 90;
else if (lng_b < lng_a && lat_b == lat_a) res = 270;
else if (lng_b == lng_a && lat_b > lat_a) res = 0;
else if (lng_b == lng_a && lat_b < lat_a) res = 180;
return res;
},
// 通过角度算方向
calculationDirection: (angle, comefromValue, toValue, comfromDirectionList, toDirectionList) => {
comefromValue = '';
toValue = '';
if (angle > 22.5 && angle <= 67.5) {
comefromValue = '西南';
toValue = '东北';
} else if (angle > 67.5 && angle <= 112.5) {
comefromValue = '西';
toValue = '东';
} else if (angle > 112.5 && angle <= 157.5) {
comefromValue = '西北';
toValue = '东南';
} else if (angle > 157.5 && angle <= 202.5) {
comefromValue = '北';
toValue = '南';
} else if (angle > 202.5 && angle <= 247.5) {
comefromValue = '东北';
toValue = '西南';
} else if (angle > 247.5 && angle <= 292.5) {
comefromValue = '东';
toValue = '西';
} else if (angle > 292.5 && angle <= 337.5) {
comefromValue = '东南';
toValue = '西北';
} else {
comefromValue = '南';
toValue = '北';
}
if (
!comfromDirectionList.find(item => {
return item.value === comefromValue;
}) ||
!toDirectionList.find(item => {
return item.value === toValue;
})
) {
comefromValue = '';
toValue = '';
}
return { comefromValue: comefromValue, toValue: toValue };
},
// 通过角度返回方向
returnDirection: angle => {
if (angle > 22.5 && angle <= 67.5) {
return '东北';
} else if (angle > 67.5 && angle <= 112.5) {
return '东';
} else if (angle > 112.5 && angle <= 157.5) {
return '东南';
} else if (angle > 157.5 && angle <= 202.5) {
return '南';
} else if (angle > 202.5 && angle <= 247.5) {
return '西南';
} else if (angle > 247.5 && angle <= 292.5) {
return '西';
} else if (angle > 292.5 && angle <= 337.5) {
return '西北';
} else {
return '北';
}
},
// 通过角度返回序号
returnDirectionNumber: angle => {
if (angle > 22.5 && angle <= 67.5) {
return '1';
} else if (angle > 67.5 && angle <= 112.5) {
return '2';
} else if (angle > 112.5 && angle <= 157.5) {
return '3';
} else if (angle > 157.5 && angle <= 202.5) {
return '4';
} else if (angle > 202.5 && angle <= 247.5) {
return '5';
} else if (angle > 247.5 && angle <= 292.5) {
return '6';
} else if (angle > 292.5 && angle <= 337.5) {
return '7';
} else {
return '0';
}
},
7.深拷贝
//深度合并-深拷贝,参数同Objec.assign
function deepMerge(obj1, obj2) {
let key;
for (key in obj2) {
// 如果target(也就是obj1[key])存在,且是对象的话再去调用deepMerge,否则就是obj1[key]里面没这个对象,需要与obj2[key]合并
// 如果obj2[key]没有值或者值不是对象,此时直接替换obj1[key]
obj1[key] =
obj1[key] &&
obj1[key].toString() === "[object Object]" &&
(obj2[key] && obj2[key].toString() === "[object Object]")
? deepMerge(obj1[key], obj2[key])
: (obj1[key] = obj2[key]);
}
return deepClone(obj1)
}
//深拷贝
function deepClone(obj) {
//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
var objClone = Array.isArray(obj) ? [] : {};
//进行深拷贝的不能为空,并且是对象或者是
if (obj && typeof obj === "object") {
let key;
for (key in obj) {
if (Object.hasOwnProperty.call(obj, key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
8.防抖
//防抖
function debounce(fn, delay = 1000) {
let timeout
return function () {
clearTimeout(timeout);
timeout = setTimeout(() => {
fn.call(this, arguments);
}, delay);
};
}
PS:文中所述方法如果有什么问题,或者同行伙伴们有什么好的方法和建议,都可以再评论区提出来,此贴将会持续更新和完善,让我们一起成长!