Utils文件常见的JavaScript方法集合

1、数值单位转换

export const numberUnitFormat =(value) => {
            let param = {};
            let k = 10000;
            let sizes = ['', '万', '亿', '万亿'];
            let i = null;
            if (value < k) {
                param.value = value;
                param.unit = '';
            } else {
                i = Math.floor(Math.log(value) / Math.log(k));
                param.value = (value / Math.pow(k, i)).toFixed(2);
                param.unit = sizes[i];
            }
            return param;
        }

   调用:numberUnitFormat(23232323343.23) => { "value": "232.32", "unit": "亿" }

2、千分位转换

export const thousandFormat = (num, obj) => {
            let param = '';
            if (!obj) {
                //格式化千分位输出
                param = num.toLocaleString();
            } else if (obj && obj.lang === 'en') {
                //格式化为千分位带$符号输出
                param = num.toLocaleString('en', { style: 'currency', currency: 'USD' });
            } else if (obj && obj.lang === 'cn') {
                //格式化为带¥符号输出
                param = num.toLocaleString('cn', { style: 'currency', currency: 'CNY' });
            } else {
                //格式化千分位输出
                param = num.toLocaleString();
            }
            return param;
        }

  调用:thousandFormat(123456789.0, { lang: 'cn' }) => ¥123,456,789.00

  千分位转数值:num.replace(/,/gi,'')

3、检查是否为空对象

/**
 * @param {Object} obj 被检查对象
 * @return {boolean} 检查结果
 */
export function isEmptyObject(obj) {
    return obj && Object.keys(obj).length === 0;
}

4、path后面增加query信息

/**
 * 如果path中有 ?则query用 & 连接,否则用 ?连接
 *
 * @param {string} path 路径信息
 * @param {Object} query query参数
 * @return {string} 加上query的path结果
 */
export const pathWithQuery = (path, query) => {
    return ~path.indexOf('?')
        ? `${path}&${queryStringify(query)}`
        : `${path}?${queryStringify(query)}`;
};

5、检查是不是全面屏(移动端)

/**
 * @return {boolean} 是不是全面屏机型
 */
export const checkFullScreen = () => {
    try {
        return getSystemInfo().then(info => {
            const tempInfo = info.model.toLowerCase();
            return Promise.resolve([
                'iphone x',
                'iphone xr',
                'iphone xs',
                'iphone xs max',
                'iphone 11',
                'iphone 11 pro',
                'iphone 11 pro max',
                'iphone 12',
                'iphone 12 pro',
                'iphone 12 pro max'
            ].some(ele => tempInfo.includes(ele)));
        });
    } catch (err) {
        console.log('设备信息获取失败', err);
        Promise.resolve(false);
    }
};

6、节流函数,控制函数重复执行的周期

/**
 * @param {Function} fn 目标函数
 * @param {number} timeout 截流间隔时间
 * @return {Function} 待执行函数
 */
export function throttle(fn, timeout = 500) {
    let lastApplyTime = 0;

    return function (...args) {
        const nowTime = Date.now();

        if (nowTime - lastApplyTime > timeout) {
            lastApplyTime = nowTime;
            return fn.apply(this, args);
        }
    };
}

7、new图片对象来预加载

// 预加载图片缓存列表
const preImgList = [];

/**
 * 通过new图片对象来预加载图片
 * @param {string} url 图片地址
 *
 */
export function preloadImage(url = '') {
    const img = new Image();
    img.src = url;
    preImgList.push(img);
}

8、数组去重

/**
 * 如果是纯粹数组,用es6 Set去重,只需要传arr即可
 * @param  {} arr 数组 or 对象数组
 * @param  {} params 数组对象去重时根据key值去重
 */
export const uniq = (arr, params) => {
	if (!Array.isArray(data)) {
		return arr;
	}
	if (params) {
		let obj = {};
		let newArr = arr.reduce((perv, cur) => {
			obj[cur[params.key]]
				? ''
				: (obj[cur[params.key]] = true && perv.push(cur));
			return perv;
		}, []);
		return newArr;
	} else {
		return Array.from(new Set(arr));
	}
};

   调用:uniq(data, { key: 'id' }) => 返回根据ID去重后的对象数组列表

9、对象数组去重

/**
 * 数组的对象完全匹配后去重
 * @param  {} data 对象数组
 */
export const uniqObject = (data) => {
	let uniques = [];
	let stringify = {};
	for (let i = 0; i < data.length; i++) {
		let keys = Object.keys(data[i]);
		keys.sort(function (a, b) {
			return Number(a) - Number(b);
		});
		let str = '';
		for (let j = 0; j < keys.length; j++) {
			str += JSON.stringify(keys[j]);
			str += JSON.stringify(data[i][keys[j]]);
		}
		if (!stringify.hasOwnProperty(str)) {
			uniques.push(data[i]);
			stringify[str] = true;
		}
	}
	uniques = uniques;
	return uniques;
};

   调用:uniqObject(data) => 返回去重后的对象数组列表

10、扁平数组与JSON树形互转

export const listToTree = (list, childName = 'children') => {
    const res = [];
    const map = list.reduce((res, v) => ((res[v.id] = v), res), {});

    for (const item of list) {
            if (item.parentId === 0) {
                    res.push(item);
                    continue;
            }
            if (item.parentId in map) {
                    const parent = map[item.parentId];
                    parent[childName] = parent[childName] || [];
                    parent[childName].push(item);
            }
    }
    return res;
}

  调用:listToTree(data) => 返回树形数组

11、树形结构转扁平数组列表

export const treeToList = (data, childName = 'children') => {
    // if (!Array.isArray(data)) {
    // 	return [];
    // }
    return data.reduce(
        (prev, cur) =>
            prev.concat([cur], treeToList(cur[childName] || [])),
        []
    );
};

   调用:treeToList(data) => 返回扁平数组列表

12、动态加载脚本


export const dynamicJsLoading (jsPath, callback, async, afterJs) {
    var js=$("script[src='"+jsPath+"']");
    if(js.length>0) return;

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = jsPath;
    var fn = callback || function(){}; 
    if (async) {
        script.setAttribute("async", true);
        script.setAttribute("defer", "");

        if (script.readyState) {//IE
            script.onreadystatechange = function () {
                if (script.readyState == 'loaded' || script.readyState == 'complete') {
                    script.onreadystatechange = null;
                    console.log("dynamicJsLoading");
                    fn();
                }
            };
        } else {//其他浏览器        
            script.onwaiting = function () {
                console.log("dynamicJsLoading");
                fn();
            };
            script.onload  = function () {
                console.log("dynamicJsLoading");
                script.onload = null;
                fn();
            };
        }
    }

    if(afterJs) {
        $("script[src*='" + afterJs + "']").last().after(script);
    }
    else{
        // document.getElementsByTagName("head")[0].appendChild(script);
        $("script[src*='jquery.min']").last().after(script);
    }

    if(!async) 
        fn();
};

13、动态加载css


export const dynamicCssLoading (cssPath, callback, afterCss) {
    var css = $("link[href='" + cssPath + "']");
    if (css.length > 0) return;

    var css = document.createElement('link');
    css.rel = 'stylesheet';
    css.href = cssPath;

    if (afterCss) {
        $("link[href*='" + afterCss + "']").last().after(css);
    }
    else {
        // document.getElementsByTagName("head")[0].appendChild(script);
        $("head").last().append(css);
    }

    if (callback)
        callback();
}

14、RequireJS动态加载模块

/**
*  @isWinobj  
*  @moduleName 模块名称
**/
export const dynamicRequireJS =(moduleName, isWinobj) => {
    if (isWinobj) {
        if (!window[moduleName]) {
            window[moduleName] = require(moduleName);
        }
        return window[moduleName];
    } else {
        return require(moduleName);
    }
}

15、统一日志打印

export function pathWithQuery (log) {
    if(true === util.debug){
        console.log(log);
    }
}

16、统一页面跳转方法

/**
 * @param {*跳转类型} type 
 * @param {*跳转地址} url 
 */
export const goPage = (type,url) => {
     switch (type){
         //页面跳转
         case 1:
             window.location.href = url;
             break;
         //返回上一个页面
         case 2:
             window.history.go(-1);
             break;
         //返回并刷新上一个页面
         case 3:
             window.location.href = document.referrer;
     }
 };

17、2个数组合并成1个数组对象

/**
 * @param {*} arr1 数组1
 * @param {*} arr2 数组2
 * @param {*} param1 
 * @param {*} param2 
 * @returns 
 */
export const arrayMerge = (arr1,arr2,param1,param2) => {
     var newArray = [];
     $.each(arr1,function (i,v) {
         var obj = {};
         obj[param1] = v;
         $.each(arr2,function (j,k) {
             if(i === j){
                 obj[param2] = k;
             }
         })
         newArray.push(obj);
     });
     return newArray;
 };

18、在data数组中删除obj对象

export const remove = (data, obj) =>{
        for(var i = 0; i < data.length; i++){
            if(data[i] == obj){
                //删除下标为i的元素
                data.splice(i, 1);
            }
        }
        return data;
    }

19、通过属性值查找数组某一项

export function findArrItemByPropVal(arr, prop, val) {
    let result = null;
    for (let i = 0, l = arr.length; i < l; i++) {
        if (arr[i][prop] === val) {
            result = arr[i];
            break;
        }
    }
    return result;
}

20、获取指定月份天数

export function getDateByMon(year, month){
    let d = new Date(year, month, 0);
    return d.getDate();
}

21、判断时间是不是今天

export function isTodayDate(time) {
    if (time.toDateString() === new Date().toDateString()) {
        return true;
    } else {
        return false;
    }
}

22、对象判空

export function isObjEmpty(obj) {
     for (let key in obj){
        return false;    //非空
     }
     return true;       //为空
}

       调用:isObjEmpty( {sex: "male"}) --> 布尔类型false

23、 数组对象属性值转换映射对象 

export function arrPropValToMap(arr, format) {
    const pArr = format.split(':');
    const p1 = pArr[0];
    const p2 = pArr[1];
    let res = {};
    for (let i = 0, l = arr.length; i < l; i++) {
        let v1 = arr[i][p1];
        let v2 = arr[i][p2];
        res[v1] = v2
    }
    return res;
}

    调用:arrPropValToMap('[{a: c, b: d}] ','a:b') --> {c: d})

24、首字母大写

export const capitalizeFirstLetter = (string) => {
    return string.charAt(0).toUpperCase() + string.slice(1);
};

   调用:capitalizeFirstLetter('promise') => Promise

25、判断两个字符串是否相等

/**
 * 相等返回true否则返回false
 *
 * @param {} source
 * @param {} target
 */
export function decideString(source, target) {
    return (source == target) ? true : false;
}

    调用: decideString('abcd','sdasc')  --> 布尔类型false

26、js判断对象中是否有某个属性

/**
 * @param {*} obj 对象
 * @param {*} params 参数
 * @returns 
 */
export const isHasOwnPro = (obj, params) =>{
    if (obj.hasOwnProperty(params)){
       return true;
    }else {
        return false;
    }
}

      调用:isHasOwnPro({sex: "male"},'sex')  --> true

27、 检查一个数是否是整数则位数在8以内

/**
 * @param {} source
 */
export function checkIntLeng(source) {
    var regex = /^[1-9]{1}[0-9]{1,7}$/g
    return regex.test(source);
}

28、判断字符串是否为空

/**
 * 若为空则返回true否则返回false
 * @param source
 * @return true或者false
 **/
export function isEmptyString(source){
    var str = source.replace(/(^\s*)|(\s*$)/g,"");
    if(str=="" || str.toLowerCase()=="null" || str.length<=0){
        return true;
    }else{
        return false;
    }
}

   调用: isEmptyString('dasedfeaw') ---> false

29、验证是否为电话号码

/**
 * 验证是否为座机号码
 * @param {} source
 */
 
export function isTelephone(source) {
    var regex = /^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$/
    return regex.test(source); 
}
 


/**
 * 验证是否移动手机
 * @param {}source
 */
 
export function isMobilePhone(source) {
    var regex = /^((\(\d{3}\))|(\d{3}\-))?1\d{10}/;
    return regex.test(source);
}

30、获取文件的扩展名

/**
 * @param {} filename 文件
 */
export function getFileExt(filename){
    var d=/\.[^\.]+$/.exec(filename);
    var ext = new String(d);
    var s = ext.toLowerCase();
    return s;
}

31、字符串编码

export function strEncode(source){
    return encodeURIComponent(source);
}


32、字符串解码

export function strDencode(source){
    return decodeURIComponent(source);
}

猜你喜欢

转载自blog.csdn.net/ShIcily/article/details/121977880