js工具方法

71 阅读2分钟

/** * 數據類型檢測 * params: variable */

 let _type = typeof tag,
   _toStr = Object.prototype.toString;

 if (_type === "object") {
   let res = _toStr.call(tag).slice(8, -1);
   return res.toLowerCase();
 } else {
   return _type;
 }
}


/**
* 反轉數組, 返回處理后的數組
* 引用类型: 会变更原数组
* params: array
*/ 

export function reversalArr(arr) {
 let left = 0,
   right = arr.length - 1,
   temp;

 while (left < right) {
   temp = arr[left];
   arr[left++] = arr[right];
   arr[right--] = temp;
 }
 return arr;
}

/**
* 獲取對象成員的個數
* params: object
*/

export function objSize(target) {
 let s = Object.prototype.toString.call(target);
 if (s === "[object Object]") {
   return Object.keys(target).length;
 }
}

/**
* 判断回文字符
* params: string
*/
export function judgeStr(str) {
 if (typeof str === "string") {
   str = str.toLowerCase();
   let s = str.split("").reverse().join("");
   return s === str;
 }
}

/**
* 字符串去重
* params: string
*/

export function removeRepString(str) {
 if (typeof str === "string") {
   let strBox = {},
     strArr = [],
     len = str.length,
     curr;
   for (let i = 0; i < len; i++) {
     curr = str[i];
     if (!strBox[curr]) {
       strBox[curr] = true;
       strArr.push(curr);
     }
   }
   return strArr.join("");
 }
}

/**
* 統計出現頻次最高的字符
* params: str;
* return->array: 字符、出现次数
*/

export function maximumTime(str) {
 let len = str.length,
   temp,
   maxStr = "",
   maxCount = 0;
 str = str.split("").sort().join("");
 for (let i = 0; i < len; i++) {
   temp = str.charAt(i);
   let _count = str.lastIndexOf(temp) - i + 1;
   if (_count > maxCount) {
     maxCount = _count;
     maxStr = temp;
   }
   i = str.lastIndexOf(temp);
 }
 return [maxStr, maxCount];
}

/**
* 深拷貝(對象、數組)
* params: [array || object]
*/

export function deepClone(obj) {
 if (typeof obj !== "object" || obj === null) {
   return obj;
 }

 let result = new obj.constructor();
 for (let key in obj) {
   if (Object.hasOwn(obj, key)) {
     result[key] = deepClone(obj[key]);
   }
 }

 return result;
}

/**
* Map 序列化,
* params: Map
*/

export function seriallizeMap(map) {
 function replacer(key, value) {
   if (value instanceof Map) {
     return {
       type: "isMap",
       value: [...value],
     };
   } else {
     return value;
   }
 }

 function revier(key, value) {
   if (value.type === "isMap") {
     return new Map(value.value);
   } else {
     return value;
   }
 }

 let strRes = JSON.stringify(map, replacer);
 let parRes = JSON.parse(strRes, revier);
 return parRes;
}

/**
* 手機號校驗
* params: phone
*/
export function verifyPhone(nub) {
 return /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/.test(
   nub
 );
}

/**
* 郵箱號校驗
* params: Email
*/
export function verifyEmail(em) {
 return /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(em);
}

/**
* 查看對象屬性描述,
* params: obj
*/

export function propertyDes(obj) {
 return Object.getOwnPropertyDescriptors(obj);
}

/**
* 数组去重, 排序(可选),
* params: array, 排序标记true||false(默认false)
*/

export function removeRepOrSort(arr, sign = false) {
 let res = arr.filter((item, index) => {
   return arr.indexOf(item) === index;
 });
 // 如果需要排序
 if (sign) {
   res.sort((a, b) => {
     if (a > b) {
       return 1;
     } else if (a < b) {
       return -1;
     } else {
       return 0;
     }
   });
 }
 return res;
}

/**
* 查詢數組元素出現頻次,
* params: array, element可選(要查詢的單個元素)默認不查詢,
* return: Map對象
*/

export function frequencyCount(arr, element = "") {
 let result = arr.reduce(function (prev, curr) {
   let count = prev.get(curr);
   prev = prev.has(curr) ? prev.set(curr, ++count) : prev.set(curr, 1);
   return prev;
 }, new Map());

 if (element) {
   return result.get(element);
 }
 return result;
}

/**
* 過濾數組假值,不變更源數組
* params: array
*/

export function removeEmpty(arr) {
 return arr.filter((v) => v);
}

/**
* 找出兩個數組的交集元素,
* params: [array1, array2],
* return: 交集元素
*/

export function Intersection(ar1, ar2) {
 return ar1.filter((x) => {
   return ar2.includes(x);
 });
}

/**
* 找出兩個數組的非交集元素,
* params: [arr1, arr2, selectReturnElement]
* return: 所有非交集元素或array1,array2單獨的非交集元素,默認all
*/

export function arrDifference(ar1, ar2, selectGet = "all") {
 let r1 = ar1.filter((x) => !ar2.includes(x));
 let r2 = ar2.filter((y) => !ar1.includes(y));
 switch (selectGet) {
   case "all":
     return [...r1, ...r2];
   case 1:
     return [...r1];
   case 2:
     return [...r2];
   default:
     break;
 }
}

/**
* 求數組平均值,
* params: array
*/

export function average(arr) {
 if (Array.isArray(arr)) {
   return (
     arr.reduce((prev, curr) => {
       return prev + curr;
     }, 0) / arr.length
   );
 }
}

/**
* 獲取數組數組最大||最小值,
* params: [arr, max or min]
*/
export function maxOrmin(arr, m = "max") {
 if (!Array.isArray(arr)) return;
 return m === "max" ? Math.max(...arr) : Math.min(...arr);
}

/**
* 打亂數組順序,
* params: array
*/

export function randomOrder(arr) {
 if (!Array.isArray(arr)) return;
 return arr.sort(() => Math.random() - 0.5);
}

/**
* 扁平化數組,
* params: [arr]
*/

export function deepFlatten(arr) {
 return arr.reduce((prev, curr) => {
   return prev.concat(Array.isArray(curr) ? deepFlatten(curr) : curr);
 }, []);
}