首页 > 技术文章 > JS常用的工具方法

hanzhe 2021-10-22 10:22 原文

每次需要用到什么工具方法都要去百度上查好久,今天发布了这篇帖子用于记录一些我经常使用的方法,不定期更新随时补充

校验字符串是否为空串

/**
 * 判断字符串是不是NULL或空串或空格组成
 * @param str 被判断的字符串
 * @return {boolean} 为空返回true,不为空返回false
 */
function strIsBlank(str) {
    // 判断是否为空
    if (str == null || str.length < 1) {
        return true
    }
    // 判断是否为空格组成
    return new RegExp("^[ ]+$").test(str);
}

/**
 * 判断字符串是不是NULL或空串或空格组成
 * @param str 被判断的字符串
 * @return {boolean} 不为空返回true,为空返回false
 */
function strIsNotBlank(str) {
    return !strIsBlank(str);
}

将Date、毫秒值转换为字符串的年月日

/**
 * zhe-将Date转换为字符串时间
 * @param date Date对象
 * @param pattern 转换规则,默认为 yyyy-MM-dd HH:mm:ss
 * @return {string} 返回的时间字符串
 */
function dateFormatByObj(date, pattern = "yyyy-MM-dd HH:mm:ss") {
    var o = {
        "M+": date.getMonth() + 1,
        "d+": date.getDate(),
        "H+": date.getHours(),
        "m+": date.getMinutes(),
        "s+": date.getSeconds(),
        "q+": Math.floor((date.getMonth() + 3) / 3),
        "S": date.getMilliseconds()
    };
    if (/(y+)/.test(pattern)) {
        pattern = pattern.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    for (var k in o) {
        if (new RegExp("(" + k + ")").test(pattern)) {
            pattern = pattern.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        }
    }
    return pattern;
}

/**
 * zhe-毫秒值转换为字符串时间
 * @param time 时间戳
 * @param pattern 转换规则,默认为 yyyy-MM-dd HH:mm:ss
 * @return {string} 返回的时间字符串
 */
function dateFormatByTime(time, pattern = "yyyy-MM-dd HH:mm:ss") {
    return dateFormatByObj(new Date(time), pattern);
}

递归删除JS对象中的NULL值

function removeNulls(obj){
  var isArray = obj instanceof Array;
  for (var k in obj){
    if (obj[k]===null) isArray ? obj.splice(k,1) : delete obj[k];
    else if (typeof obj[k]=="object") removeNulls(obj[k]);
  }
}

将阿拉伯数字转换为中文大写的形式

/**
 * 例如:1234 → 一千二百三十四
 * 代码是网上找的,自己稍微做了点修改,目前最大数字可支持到千万
 */
function toChinaNumber(number) {
    if (typeof (number) != 'number') {
        console.error("util.js:getChinaNumber:传入只能是number")
    }
    let changeNum = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']; //changeNum[0] = "零"
    let unit = ["", "十", "百", "千", "万"];
    number = parseInt(number);
    let getWan = (temp) => {
        let strArr = temp.toString().split("").reverse();
        let newNum = "";
        for (var i = 0; i < strArr.length; i++) {
            newNum = (i == 0 && strArr[i] == 0 ? "" : (i > 0 && strArr[i] == 0 && strArr[i - 1] == 0 ? "" : changeNum[strArr[i]] + (strArr[i] == 0 ? unit[0] : unit[i]))) + newNum;
        }
        return newNum;
    }
    let overWan = Math.floor(number / 10000);
    let noWan = number % 10000;
    if (noWan.toString().length < 4) noWan = "0" + noWan;
    let result = overWan ? getWan(overWan) + "万" + getWan(noWan) : getWan(number);
    if (result.indexOf("一十") != -1) {
        result = result.substr(1);
    }
    return result;
}

遍历节点数,返回最深的那一层的深度

/**
 * @param obj  需要获取深度的对象
 * @param attr 对象中代表子节点的属性名,例如children
 */
function getDeepNumber(obj, attr) {
    // 定义变量用来存储最深深度
    let deepNumber = 0;
    // 创建递归函数用于获取深度
    let recursion = (obj, num = 0) => {
        // num代表当前分支的深度,默认值为0,每次执行一次深度+1
        num++;
        // 在该节点有子节点的情况下递归调用
        if (obj[attr].length != 0) {
            obj[attr].forEach(item => recursion(item, num));
        }
        // 当没有子节点的时候代表已经是当前分支的最后一层,将深度赋值给deepNumber
        deepNumber = (num > deepNumber) ? num : deepNumber;
        // 当前递归结束后需要-1,然后递归上一层的其他节点
        num--;
    };
    recursion(obj);
    return deepNumber;
}

推荐阅读