* 深度拷贝
* @param {any} sObj 拷贝的对象
* @returns
*/
public static clone(sObj: any) {
if (sObj === null || typeof sObj !== "object") {
return sObj;
}
let s: { [key: string]: any } = {};
if (sObj.constructor === Array) {
s = [];
}
for (let i in sObj) {
if (sObj.hasOwnProperty(i)) {
s[i] = this.clone(sObj[i]);
}
}
return s;
}
2.将object转化为数组
* 将object转化为数组
* @param { any} srcObj
* @returns
*/
public static objectToArray(srcObj: { [key: string]: any }) {
let resultArr: any[] = [];
// to array
for (let key in srcObj) {
if (!srcObj.hasOwnProperty(key)) {
continue;
}
resultArr.push(srcObj[key]);
}
return resultArr;
}
3.将数组转化为object
* @param { any} srcObj
* @param { string} objectKey
* @returns
*/
public static arrayToObject(srcObj: any, objectKey: string) {
let resultObj: { [key: string]: any } = {};
// to object
for (var key in srcObj) {
if (!srcObj.hasOwnProperty(key) || !srcObj[key][objectKey]) {
continue;
}
resultObj[srcObj[key][objectKey]] = srcObj[key];
}
return resultObj;
}
4.从n个数中获取m个随机数
* 从n个数中获取m个随机数
* @param {Number} n 总数
* @param {Number} m 获取数
* @returns {Array} array 获取数列
*/
public static getRandomNFromM(n: number, m: number) {
let array: any[] = [];
let intRd: number = 0;
let count: number = 0;
while (count < m) {
if (count >= n + 1) {
break;
}
intRd = this.getRandomInt(0, n);
var flag = 0;
for (var i = 0; i < count; i++) {
if (array[i] === intRd) {
flag = 1;
break;
}
}
if (flag === 0) {
array[count] = intRd;
count++;
}
}
return array;
}
5.在一定范围内获取随机整数(包含左右)
* 获取随机整数
* @param {Number} min 最小值
* @param {Number} max 最大值
* @returns
*/
public static getRandomInt(min: number, max: number) {
let r: number = Math.random();
let rr: number = r * (max - min + 1) + min;
return Math.floor(rr);
}
6.获取随机数
* 获取随机数
* @param {Number} min 最小值
* @param {Number} max 最大值
* @returns
*/
public static getRandom(min: number, max: number) {
let r: number = Math.random();
let rr: number = r * (max - min) + min;
return rr;
}
7. 获取字符串长度
* 获取字符串长度
* @param {string} render
* @returns
*/
public static getStringLength(render: string) {
let strArr: string = render;
let len: number = 0;
for (let i: number = 0, n = strArr.length; i < n; i++) {
let val: number = strArr.charCodeAt(i);
if (val <= 255) {
len = len + 1;
} else {
len = len + 2;
}
}
return Math.ceil(len / 2);
}
8.判断是否是新的一天
* 判断是否是新的一天
* @param {Object|Number} dateValue 时间对象 todo MessageCenter 与 pve 相关的时间存储建议改为 Date 类型
* @returns {boolean}
*/
public static isNewDay(dateValue: any) {
// todo:是否需要判断时区?
var oldDate: any = new Date(dateValue);
var curDate: any = new Date();
//@ts-ignore
var oldYear = oldDate.getYear();
var oldMonth = oldDate.getMonth();
var oldDay = oldDate.getDate();
//@ts-ignore
var curYear = curDate.getYear();
var curMonth = curDate.getMonth();
var curDay = curDate.getDate();
if (curYear > oldYear) {
return true;
} else {
if (curMonth > oldMonth) {
return true;
} else {
if (curDay > oldDay) {
return true;
}
}
}
return false;
}
9. 字符串转数组
* 字符串转数组
* @param string
* @private
*/
public static _stringToArray(string: string) {
// 用于判断emoji的正则们
var rsAstralRange = '\\ud800-\\udfff';
var rsZWJ = '\\u200d';
var rsVarRange = '\\ufe0e\\ufe0f';
var rsComboMarksRange = '\\u0300-\\u036f';
var reComboHalfMarksRange = '\\ufe20-\\ufe2f';
var rsComboSymbolsRange = '\\u20d0-\\u20ff';
var rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;
var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');
var rsFitz = '\\ud83c[\\udffb-\\udfff]';
var rsOptVar = '[' + rsVarRange + ']?';
var rsCombo = '[' + rsComboRange + ']';
var rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')';
var reOptMod = rsModifier + '?';
var rsAstral = '[' + rsAstralRange + ']';
var rsNonAstral = '[^' + rsAstralRange + ']';
var rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}';
var rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]';
var rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*';
var rsSeq = rsOptVar + reOptMod + rsOptJoin;
var rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
var hasUnicode = function (val: any) {
return reHasUnicode.test(val);
};
var unicodeToArray = function (val: any) {
return val.match(reUnicode) || [];
};
var asciiToArray = function (val: any) {
return val.split('');
};
return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
}
10.判断当前时间是否在有效时间范围内
* 判断当前时间是否在有效时间内
* @param {String|Number} start 起始时间。带有时区信息
* @param {String|Number} end 结束时间。带有时区信息
*/
public static isNowValid(start: any, end: any) {
var startTime = new Date(start);
var endTime = new Date(end);
var result = false;
if (startTime.getDate() + '' !== 'NaN' && endTime.getDate() + '' !== 'NaN') {
var curDate = new Date();
result = curDate < endTime && curDate > startTime;
}
return result;
}
11.返回相隔天数
* 返回相隔天数
* @param start
* @param end
* @returns
*/
public static getDeltaDays(start: any, end: any) {
start = new Date(start);
end = new Date(end);
let startYear: number = start.getFullYear();
let startMonth: number = start.getMonth() + 1;
let startDate: number = start.getDate();
let endYear: number = end.getFullYear();
let endMonth: number = end.getMonth() + 1;
let endDate: number = end.getDate();
start = new Date(startYear + '/' + startMonth + '/' + startDate + ' GMT+0800').getTime();
end = new Date(endYear + '/' + endMonth + '/' + endDate + ' GMT+0800').getTime();
let deltaTime = end - start;
return Math.floor(deltaTime / (24 * 60 * 60 * 1000));
}
12. 获取数组最小值
* 获取数组最小值
* @param array 数组
* @returns
*/
public static getMin(array: number[]) {
let result: number = null!;
if (array.constructor === Array) {
let length = array.length;
for (let i = 0; i < length; i++) {
if (i === 0) {
result = Number(array[0]);
} else {
result = result > Number(array[i]) ? Number(array[i]) : result;
}
}
}
return result;
}
13.格式化两位小数点
* 格式化两位小数点
* @param time
* @returns
*/
public static formatTwoDigits(time: number) {
return (Array(2).join(0) + time).slice(-2);
}
14.格式化时间戳(时分秒)
* 格式化时间戳
* return 时分秒
*/
public static formatTimestamp(time: number) {
let str = "";
if (time >= 1000 * 60 * 60) {
str += Math.floor(time / (1000 * 60 * 60)) + "时";
time = time % (1000 * 60 * 60);
}
if (time >= 1000 * 60) {
str += Math.floor(time / (1000 * 60)) + "分";
time = time % (1000 * 60);
}
if (time >= 1000) {
str += Math.floor(time / 1000) + "秒";
}
if (str == "") {
return "0秒";
} else {
return str;
}
}
15.格式化日期(不含时分秒)
* 获取格式化后的日期(不含小时分秒)
*/
public static getDay(time?: number | Date) {
let date: Date
if (!time) {
date = new Date()
}
else if (typeof time == "number") {
date = new Date(time)
}
else {
date = time
}
return date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate();
}
16.缩略显示字符串,用…替换
* 格式化名字,XXX...
* @param {string} name 需要格式化的字符串
* @param {number}limit
* @returns {string} 返回格式化后的字符串XXX...
*/
public static formatName(name: string, limit: number) {
limit = limit || 6;
var nameArray = this._stringToArray(name);
var str = '';
var length = nameArray.length;
if (length > limit) {
for (var i = 0; i < limit; i++) {
str += nameArray[i];
}
str += '...';
} else {
str = name;
}
return str;
}
17.格式化金额
* 格式化金钱数,超过10000 转换位 10K 10000K 转换为 10M,保留两位小数
* @param {number}money 需要被格式化的数值
* @returns {string}返回 被格式化的数值
*/
public static formatMoney(money: number) {
let arrUnit: string[] = ['', '万', '亿', '兆', '京', '垓', '秭', '穣', '沟', '涧', '正', '载', '极'];
let strValue: string = '';
for (let idx: number = 0; idx < arrUnit.length; idx++) {
if (money >= 1E+4) {
money /= 1E+4;
} else {
let str = money.toFixed(2).toString()
strValue = this.removeTrailingZeros(str) + arrUnit[idx];
break;
}
}
if (strValue === '') {
let str = money.toFixed(2).toString()
strValue = this.removeTrailingZeros(str) + 'U'; //超过最大值就加个U
}
return strValue;
}
//去除多余0
public static removeTrailingZeros(numberString: string): string {
let trimmedString = numberString.trim(); // 去除首尾空格
let decimalIndex = trimmedString.indexOf('.');
if (decimalIndex !== -1) {
let endIndex = trimmedString.length - 1;
while (trimmedString[endIndex] === '0') {
endIndex--;
}
if (trimmedString[endIndex] === '.') {
endIndex--; // 如果小数点后面全是零,也去掉小数点
}
return trimmedString.slice(0, endIndex + 1);
}
return trimmedString;
}
18.格式化剩余时间 返回 HH:MM:SS
* 根据剩余秒数格式化剩余时间 返回 HH:MM:SS
* @param {Number} leftSec
*/
public static formatTimeForSecond(leftSec: number, withoutSeconds: boolean = false) {
let timeStr: string = '';
let sec: number = leftSec % 60;
let leftMin: number = Math.floor(leftSec / 60);
leftMin = leftMin < 0 ? 0 : leftMin;
let hour: number = Math.floor(leftMin / 60);
let min: number = leftMin % 60;
if (hour > 0) {
timeStr += hour > 9 ? hour.toString() : '0' + hour;
timeStr += ':';
} else {
timeStr += '00:';
}
timeStr += min > 9 ? min.toString() : '0' + min;
if (!withoutSeconds) {
timeStr += ':';
timeStr += sec > 9 ? sec.toString() : '0' + sec;
}
return timeStr;
}
19.根据剩余毫秒数返回剩余时间(时分秒)
* 根据剩余毫秒数格式化剩余时间 返回{h,m,s}
*
* @param {Number} ms
*/
public static formatTimeForMillisecond(ms: number): Object {
let second: number = Math.floor(ms / 1000 % 60);
let minute: number = Math.floor(ms / 1000 / 60 % 60);
let hour: number = Math.floor(ms / 1000 / 60 / 60);
return { 'hour': hour, 'minute': minute, 'second': second };
}
20.随机排列数组内容
/**
*将数组内容进行随机排列
* @param {Array}arr 需要被随机的数组
* @returns
*/
public static rand(arr: []): [] {
let arrClone = this.clone(arr);
// 首先从最大的数开始遍历,之后递减
for (let i: number = arrClone.length - 1; i >= 0; i--) {
// 随机索引值randomIndex是从0-arrClone.length中随机抽取的
const randomIndex: number = Math.floor(Math.random() * (i + 1));
// 下面三句相当于把从数组中随机抽取到的值与当前遍历的值互换位置
const itemIndex: number = arrClone[randomIndex];
arrClone[randomIndex] = arrClone[i];
arrClone[i] = itemIndex;
}
// 每一次的遍历都相当于把从数组中随机抽取(不重复)的一个元素放到数组的最后面(索引顺序为:len-1,len-2,len-3......0)
return arrClone;
}
21.返回数组中的一个随机元素
/* 返回数组中的一个随机元素
* @param arr 数组
* @returns 数组中随机一个,以及对应的下标
*/public static ranGetFromArray<T>(arr: Array<T>) {
let len = arr.length;
let idx = Math.floor(len * Math.random());
return arr[idx], idx;
}
22.数组乱序
public static shuffle(arr: any) {
if (Array.isArray(arr)) {
let newArr: any = arr.concat();
newArr.sort(() => {
return 0.5 - Math.random()
});
return newArr;
}
}