1. 防抖
let timeout = null ;
export const debounce = function ( func, wait = 500 , immediate = false ) {
if ( timeout !== null ) clearTimeout ( timeout) ;
if ( immediate) {
var callNow = ! timeout;
timeout = setTimeout ( function ( ) {
timeout = null ;
} , wait) ;
if ( callNow) typeof func === 'function' && func ( ) ;
} else {
timeout = setTimeout ( function ( ) {
typeof func === 'function' && func ( ) ;
} , wait) ;
}
}
2. 节流
let timer;
let flag;
export const throttle = function ( func, wait = 500 , immediate = true ) {
if ( immediate) {
if ( ! flag) {
flag = true ;
typeof func === 'function' && func ( ) ;
timer = setTimeout ( ( ) => {
flag = false ;
} , wait) ;
}
} else {
if ( ! flag) {
flag = true
timer = setTimeout ( ( ) => {
flag = false
typeof func === 'function' && func ( ) ;
} , wait) ;
}
}
} ;
3. 深度克隆(深拷贝)
function isArray ( arr ) {
return Object . prototype. toString . call ( arr) === '[object Array]' ;
}
export const deepClone = function ( obj ) {
if ( [ null , undefined , NaN , false ] . includes ( obj) ) {
return obj;
}
if ( typeof obj !== "object" && typeof obj !== 'function' ) {
return obj;
}
var o = isArray ( obj) ? [ ] : { } ;
for ( let i in obj) {
if ( obj. hasOwnProperty ( i) ) {
o[ i] = typeof obj[ i] === "object" ? deepClone ( obj[ i] ) : obj[ i] ;
}
}
return o;
}
4. 对象深度合并
export const deepMerge = function ( target = { } , source = { } ) {
target = deepClone ( target) ;
if ( typeof target !== 'object' || typeof source !== 'object' ) return false ;
for ( var prop in source) {
if ( ! source. hasOwnProperty ( prop) ) continue ;
if ( prop in target) {
if ( typeof target[ prop] !== 'object' ) {
target[ prop] = source[ prop] ;
} else {
if ( typeof source[ prop] !== 'object' ) {
target[ prop] = source[ prop] ;
} else {
if ( target[ prop] . concat && source[ prop] . concat) {
target[ prop] = target[ prop] . concat ( source[ prop] ) ;
} else {
target[ prop] = deepMerge ( target[ prop] , source[ prop] ) ;
}
}
}
} else {
target[ prop] = source[ prop] ;
}
}
return target;
}
5. 对象转url参数
export const queryParams = function ( data = { } , isPrefix = true , arrayFormat = 'brackets' ) {
let prefix = isPrefix ? '?' : ''
let _result = [ ]
if ( [ 'indices' , 'brackets' , 'repeat' , 'comma' ] . indexOf ( arrayFormat) == - 1 ) arrayFormat = 'brackets' ;
for ( let key in data) {
let value = data[ key]
if ( [ '' , undefined , null ] . indexOf ( value) >= 0 ) {
continue ;
}
if ( value. constructor === Array) {
switch ( arrayFormat) {
case 'indices' :
for ( let i = 0 ; i < value. length; i++ ) {
_result. push ( key + '[' + i + ']=' + value[ i] )
}
break ;
case 'brackets' :
value. forEach ( _value => {
_result. push ( key + '[]=' + _value)
} )
break ;
case 'repeat' :
value. forEach ( _value => {
_result. push ( key + '=' + _value)
} )
break ;
case 'comma' :
let commaStr = "" ;
value. forEach ( _value => {
commaStr += ( commaStr ? "," : "" ) + _value;
} )
_result. push ( key + '=' + commaStr)
break ;
default :
value. forEach ( _value => {
_result. push ( key + '[]=' + _value)
} )
}
} else {
_result. push ( key + '=' + value)
}
}
return _result. length ? prefix + _result. join ( '&' ) : ''
}
6. 获取两个数之间的随机数
export const random = function ( min, max ) {
if ( min >= 0 && max > 0 && max >= min) {
let gab = max - min + 1 ;
return Math. floor ( Math. random ( ) * gab + min) ;
} else {
return 0 ;
}
}
7. 打乱数组
export const randomArray = function ( array = [ ] ) {
return array. sort ( ( ) => Math. random ( ) - 0.5 ) ;
}
8. 时间格式化
export const timeFormat = function ( dateTime = null , fmt = 'yyyy-mm-dd' ) {
if ( ! dateTime) {
dateTime = Number ( new Date ( ) ) ;
}
if ( dateTime. toString ( ) . length == 10 ) {
dateTime *= 1000 ;
}
let date = new Date ( dateTime) ;
let ret;
let opt = {
"y+" : date. getFullYear ( ) . toString ( ) ,
"m+" : ( date. getMonth ( ) + 1 ) . toString ( ) ,
"d+" : date. getDate ( ) . toString ( ) ,
"h+" : date. getHours ( ) . toString ( ) ,
"M+" : date. getMinutes ( ) . toString ( ) ,
"s+" : date. getSeconds ( ) . toString ( )
} ;
for ( let k in opt) {
ret = new RegExp ( "(" + k + ")" ) . exec ( fmt) ;
if ( ret) {
fmt = fmt. replace ( ret[ 1 ] , ( ret[ 1 ] . length == 1 ) ? ( opt[ k] ) : ( opt[ k] . padStart ( ret[ 1 ] . length, "0" ) ) )
} ;
} ;
return fmt;
}
9. 字符串去除空格
export const trim = function ( str, pos = 'both' ) {
if ( pos == 'both' ) {
return str. replace ( / ^\s+|\s+$ / g , "" ) ;
} else if ( pos == "left" ) {
return str. replace ( / ^\s* / , '' ) ;
} else if ( pos == 'right' ) {
return str. replace ( / (\s*$) / g , "" ) ;
} else if ( pos == 'all' ) {
return str. replace ( / \s+ / g , "" ) ;
} else {
return str;
}
}
10. 一维数组转二维数组
export const arrOneChangeTwo = function ( arr, num ) {
if ( ! Array. isArray ( arr) ) {
return [ ] ;
}
if ( Array. isArray ( arr) && arr. length <= 1 ) {
return arr;
}
let a = [ ] ;
while ( arr. length > 0 ) {
a. push ( arr. splice ( 0 , num) )
}
return a;
}
11. 二维数组转一维数组
export const arrTwoChangeOne = function ( arr ) {
if ( ! Array. isArray ( arr) ) {
return [ ] ;
}
return [ ] . concat . apply ( [ ] , arr)
}
12. 深度克隆多维数组
export const deepcopyArray = function ( arr ) {
let out = [ ] ;
let i = 0 ;
let len = arr. length;
for ( ; i < len; i++ ) {
if ( arr[ i] instanceof Array ) {
out[ i] = deepcopyArray ( arr[ i] ) ;
}
else out[ i] = arr[ i] ;
}
return out;
}
13. 未完待续…