exportconstclone=parent=>{// 判断类型constisType=(obj, type)=>{if(typeof obj !=="object")returnfalse;const typeString =Object.prototype.toString.call(obj);let flag;switch(type){case"Array":
flag = typeString ==="[object Array]";break;case"Date":
flag = typeString ==="[object Date]";break;case"RegExp":
flag = typeString ==="[object RegExp]";break;default:
flag =false;}return flag;};// 处理正则constgetRegExp=re=>{var flags ="";if(re.global) flags +="g";if(re.ignoreCase) flags +="i";if(re.multiline) flags +="m";return flags;};// 维护两个储存循环引用的数组const parents =[];const children =[];const_clone=parent=>{if(parent ===null)returnnull;if(typeof parent !=="object")return parent;let child, proto;if(isType(parent,"Array")){// 对数组做特殊处理
child =[];}elseif(isType(parent,"RegExp")){// 对正则对象做特殊处理
child =newRegExp(parent.source,getRegExp(parent));if(parent.lastIndex) child.lastIndex = parent.lastIndex;}elseif(isType(parent,"Date")){// 对Date对象做特殊处理
child =newDate(parent.getTime());}else{// 处理对象原型
proto = Object.getPrototypeOf(parent);// 利用Object.create切断原型链
child = Object.create(proto);}// 处理循环引用const index = parents.indexOf(parent);if(index !=-1){// 如果父数组存在本对象,说明之前已经被引用过,直接返回此对象return children[index];}
parents.push(parent);
children.push(child);for(let i in parent){// 递归
child[i]=_clone(parent[i]);}return child;};return_clone(parent);};// 此方法存在一定局限性:一些特殊情况没有处理: 例如Buffer对象、Promise、Set、Map。// 如果确实想要完备的深拷贝,推荐使用 lodash 中的 cloneDeep 方法。
19、模糊搜索
// list 原数组// keyWord 查询的关键词// attribute 数组需要检索属性exportconst fuzzyQuery =(list, keyWord, attribute ='name')=>{const reg =newRegExp(keyWord)const arr =[]for(let i =0; i < list.length; i++){if(reg.test(list[i][attribute])){
arr.push(list[i])}}return arr
}// 示例:const list =[{id:1,name:'树哥'},{id:2,name:'黄老爷'},{id:3,name:'张麻子'},{id:4,name:'汤师爷'},{id:5,name:'胡万'},{id:6,name:'花姐'},{id:7,name:'小梅'}]fuzzyQuery(list,'树','name')// [{id: 1, name: '树哥'}]
20、遍历树节点
exportconst foreachTree =(data, callback, childrenName ='children')=>{for(let i =0; i < data.length; i++){callback(data[i])if(data[i][childrenName]&& data[i][childrenName].length >0){foreachTree(data[i][childrenName], callback, childrenName)}}}// 假设我们要从树状结构数据中查找 id 为 9 的节点const treeData =[{id:1,label:'一级 1',children:[{id:4,label:'二级 1-1',children:[{id:9,label:'三级 1-1-1'},{id:10,label:'三级 1-1-2'}]}]},{id:2,label:'一级 2',children:[{id:5,label:'二级 2-1'},{id:6,label:'二级 2-2'}]},{id:3,label:'一级 3',children:[{id:7,label:'二级 3-1'},{id:8,label:'二级 3-2'}]}],let result
foreachTree(data,(item)=>{if(item.id ===9){
result = item
}})
console.log('result', result)// {id: 9,label: "三级 1-1-1"}
数组乱序
exportconstarrScrambling=(arr)=>{for(let i =0; i < arr.length; i++){const randomIndex = Math.round(Math.random()*(arr.length -1- i))+ i;[arr[i], arr[randomIndex]]=[arr[randomIndex], arr[i]];}return arr;}
数组扁平化
exportconstflatten=(arr)=>{let result =[];for(let i =0; i < arr.length; i++){if(Array.isArray(arr[i])){
result = result.concat(flatten(arr[i]));}else{
result.push(arr[i]);}}return result;}
exportconsttoCDB=(str)=>{let result ="";for(let i =0; i < str.length; i++){
code = str.charCodeAt(i);if(code >=65281&& code <=65374){
result += String.fromCharCode(str.charCodeAt(i)-65248);}elseif(code ==12288){
result += String.fromCharCode(str.charCodeAt(i)-12288+32);}else{
result += str.charAt(i);}}return result;}
半角转换为全角
exportconsttoDBC=(str)=>{let result ="";for(let i =0; i < str.length; i++){
code = str.charCodeAt(i);if(code >=33&& code <=126){
result += String.fromCharCode(str.charCodeAt(i)+65248);}elseif(code ==32){
result += String.fromCharCode(str.charCodeAt(i)+12288-32);}else{
result += str.charAt(i);}}return result;}
数字转化为大写金额
exportconstdigitUppercase=(n)=>{const fraction =['角','分'];const digit =['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];const unit =[['元','万','亿'],['','拾','佰','仟']];
n = Math.abs(n);let s ='';for(let i =0; i < fraction.length; i++){
s +=(digit[Math.floor(n *10* Math.pow(10, i))%10]+ fraction[i]).replace(/零./,'');}
s = s ||'整';
n = Math.floor(n);for(let i =0; i < unit[0].length && n >0; i++){let p ='';for(let j =0; j < unit[1].length && n >0; j++){
p = digit[n %10]+ unit[1][j]+ p;
n = Math.floor(n /10);}
s = p.replace(/(零.)*零$/,'').replace(/^$/,'零')+ unit[0][i]+ s;}return s.replace(/(零.)*零元/,'元').replace(/(零.)+/g,'零').replace(/^整$/,'零元整');};
数字转化为中文数字
exportconstintToChinese=(value)=>{const str =String(value);const len = str.length-1;const idxs =['','十','百','千','万','十','百','千','亿','十','百','千','万','十','百','千','亿'];const num =['零','一','二','三','四','五','六','七','八','九'];return str.replace(/([1-9]|0+)/g,($, $1, idx, full)=>{let pos =0;if($1[0]!=='0'){
pos = len-idx;if(idx ==0&& $1[0]==1&& idxs[len-idx]=='十'){return idxs[len-idx];}return num[$1[0]]+ idxs[len-idx];}else{let left = len - idx;let right = len - idx + $1.length;if(Math.floor(right /4)- Math.floor(left /4)>0){
pos = left - left %4;}if( pos ){return idxs[pos]+ num[$1[0]];}elseif( idx + $1.length >= len ){return'';}else{return num[$1[0]]}}});}
存储loalStorage
exportconstloalStorageSet=(key, value)=>{if(!key)return;if(typeof value !=='string'){
value =JSON.stringify(value);}
window.localStorage.setItem(key, value);};
exportconstsessionStorageSet=(key, value)=>{if(!key)return;if(typeof value !=='string'){
value =JSON.stringify(value);}
window.sessionStorage.setItem(key, value)};
exportconstbroswer=()=>{const ua = navigator.userAgent.toLowerCase();if(ua.match(/MicroMessenger/i)=="micromessenger"){return"weixin";}elseif(ua.match(/QQ/i)=="qq"){return"QQ";}returnfalse;}