/** * 在axios的get请求中{a: 1, b: [1, 2]}需要转换为{a: 1, b: "1, 2"} */ export function ParamArrToStr(params: any) { if (typeof params != 'object') { return params; } if (params instanceof Array) { return params.join(","); } const _params = deepClone(params); // eslint-disable-next-line guard-for-in for (let key in _params) { _params[key] = ParamArrToStr(_params[key]); } return _params; } /** * 深拷贝 */ //利用 WeekMap() 的键对自己所引用对象的引用都是弱引用的特性,在没有其他引用和该键引用同一对象的情况下,这个对象将会被垃圾回收 //为了解决循环引用的问题,设置一个哈希表存储已拷贝过的对象进行循环检测,当检测到当前对象已存在于哈希表中时,取出该值并返回即可 export function deepClone(obj: any, hash = new WeakMap()) { function isComplexDataType(obj: any) { return (typeof obj === 'object' || typeof obj === 'function') && (obj !== null); } //查哈希表,防止循环拷贝。如果成环了(对象循环引用),参数obj = obj.loop = 最初的obj,则会在WeakMap中找到第一次放入的obj提前返回第一次放入WeakMap的cloneObj,解决对象循环引用的问题 if (hash.has(obj)) return hash.get(obj); //如果参数为Date, RegExp, Set, Map, WeakMap, WeakSet等引用类型,则直接生成一个新的实例 let type = [Date, RegExp, Set, Map, WeakMap, WeakSet]; if (type.includes(obj.constructor)) return new obj.constructor(obj); //遍历传入参数所有属性描述符 let allDesc = Object.getOwnPropertyDescriptors(obj); //继承原型 let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc); // 获取所有 Symbol 类型键 let symKeys = Object.getOwnPropertySymbols(obj); // 拷贝 Symbol 类型键对应的属性 if (symKeys.length > 0) { symKeys.forEach(symKey => { cloneObj[symKey] = isComplexDataType(obj[symKey]) ? deepClone(obj[symKey], hash) : obj[symKey]; }); } // 哈希表设值 hash.set(obj, cloneObj); //Reflect.ownKeys(obj)拷贝不可枚举属性和符号类型 for (let key of Reflect.ownKeys(obj)) { cloneObj[key] = (isComplexDataType(obj[key]) && typeof obj[key] !== 'function') ? deepClone(obj[key], hash) : obj[key]; } return cloneObj; } export function flattenDeep(list: any[] = []): any[] { const arr: any[] = []; if (list instanceof Array) { for (let ele of list) { if (ele instanceof Array) { const arr1 = flattenDeep(ele); for (let ele1 of arr1) { arr.push(ele1); } } else { arr.push(ele); } } } return arr; } export function groupBy(list: any[], key: string) { const data: any[] = []; for (let listEle of list) { let item = data.find(i => i[key] == listEle[key]); if (!item) { item = deepClone({...listEle, list: []}); data.push(item); } item.list.push(listEle); } return data; } export function groupBys(list: any[], key1: string, key2: string) { const data: any[] = []; for (let listEle of list) { let item = data.find(i => i[key1] == listEle[key1] && i[key2] == listEle[key2]); if (!item) { item = deepClone({...listEle, list: []}); data.push(item); } item.list.push(listEle); } return data; } export function numFormat(num: number = 0, unit?: string): string { return (unit == '%' ? num * 100 : unit == '万元' ? num / 10000 : num).toFixed(2); } /**机油类型 */ export const motorOilTypeData = [ { value: '全合成机油', label: "全合成机油" }, { value: '半合成机油', label: "半合成机油" }, { value: '矿物机油', label: "矿物机油" }, ]; /**机油等级 */ export const oilLevelData = [ {value: "SA", label: "SA"}, {value: "SB", label: "SB"}, {value: "SC", label: "SC"}, {value: "SD", label: "SD"}, {value: "SE", label: "SE"}, {value: "SF", label: "SF"}, {value: "SG", label: "SG"}, {value: "SH", label: "SH"}, {value: "SJ", label: "SJ"}, {value: "SL", label: "SL"}, {value: "SM", label: "SM"}, {value: "SN", label: "SN"}, {value: "CA", label: "CA"}, {value: "CB", label: "CB"}, {value: "CC", label: "CC"}, {value: "CD", label: "CD"}, {value: "CE", label: "CE"}, {value: "CF", label: "CF"}, {value: "CF-2", label: "CF-2"}, {value: "CF-4", label: "CF-4"}, {value: "CG-4", label: "CG-4"}, {value: "CH-4", label: "CH-4"}, {value: "CI-4", label: "CI-4"}, {value: "NE1", label: "NE1"}, ]; /**粘稠度 */ export const oilViscosityData = [ {value: "0W-20", label: "0W-20"}, {value: "0W-30", label: "0W-30"}, {value: "0W-40", label: "0W-40"}, {value: "0W-50", label: "0W-50"}, {value: "0W-60", label: "0W-60"}, {value: "5W-20", label: "5W-20"}, {value: "5W-30", label: "5W-30"}, {value: "5W-40", label: "5W-40"}, {value: "5W-50", label: "5W-50"}, {value: "5W-60", label: "5W-60"}, {value: "10W-20", label: "10W-20"}, {value: "10W-30", label: "10W-30"}, {value: "10W-40", label: "10W-40"}, {value: "10W-50", label: "10W-50"}, {value: "10W-60", label: "10W-60"}, {value: "15W-20", label: "15W-20"}, {value: "15W-30", label: "15W-30"}, {value: "15W-40", label: "15W-40"}, {value: "15W-50", label: "15W-50"}, {value: "15W-60", label: "15W-60"}, {value: "20W-20", label: "20W-20"}, {value: "20W-30", label: "20W-30"}, {value: "20W-40", label: "20W-40"}, {value: "20W-50", label: "20W-50"}, {value: "20W-60", label: "20W-60"} ]; /**燃油种类 */ export const fuelTypeData = [ { value: '汽油', label: "汽油" }, { value: '柴油', label: "柴油" }, ]; /**配件类型*/ export const partTypeData = [ { value: 1, label: "配件" }, { value: 2, label: "装潢" }, { value: 4, label: "养护" }, { value: 5, label: "机修辅料" }, { value: 6, label: "钣金辅料" }, { value: 7, label: "喷漆辅料" }, { value: 8, label: "装潢辅料" }, { value: 9, label: "打磨辅料" }, ]; /**配件类型*/ export const planPoolTypeData = [ { value: 11, label: "指定金额计划" }, { value: 12, label: "最低库销比计划" }, { value: 13, label: "指定配件计划" }, { value: 10, label: "客户订件计划" }, ]; export const typeReceiverObj: {[key: string]: string} = { '售后工单锁定': '服务', '装潢零售锁定': '销售', '调出锁定': '', '': '', }; export const typeSenderObj: {[key: string]: string} = { '售后工单锁定': '送修人:', '装潢零售锁定': '下单人:', '调出锁定': '', '': '', }; export function getUrl(url: string, obj: object): string { if (!Object.keys(obj).length) { return url; } const pa: string[] = []; for (let k in obj) { if (obj[k]) { pa.push(`${k}=${obj[k]}`); } } const st = pa.join("&"); if (st) { return `${url}?${st}`; } return ''; }