记录一些经常使用的JS通用工具方法,代码来自互联网,佛性更新

空字符串校验

/**
* 判断字符串是不是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);
}

时间格式化

/**
* 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);
}

对象深拷贝

/**
* 对象深拷贝
* @param obj 被拷贝的对象
*/
function deepCopy(obj) {
let target = null
if (typeof obj === 'object') {
//数组
if (Array.isArray(obj)) {
target = [];
obj.forEach(item => {
target.push(deepCopy(item));
})
} else if (obj) {
target = {}
let objKeys = Object.keys(obj);
objKeys.forEach(key => {
target[key] = deepCopy(obj[key]);
})
} else {
target = obj
}
} else {
target = obj;
}
return target
}

对象是否相等

/**
* 判断两个对象是否相等
* @param a 对象a
* @param b 对象b
*/
function equals(a, b) {
// 1. 空值校验
if (a == null || b == null) {
return a == b;
}
// 2. 函数校验
if (typeof(a) === 'function' || typeof(b) === 'function') {
return a == b
}
// 3. 获取对象中属性列表,数量不一致直接返回false
const aProps = Object.getOwnPropertyNames(a);
const bProps = Object.getOwnPropertyNames(b);
if (aProps.length != bProps.length) {
return false;
}
// 4. 遍历属性列表,比较值是否相等
for (let i = 0; i < aProps.length; i++) {
const propName = aProps[i]
const propA = a[propName]
const propB = b[propName]
// 如果属性类型为object,递归进入equals
if (typeof(propA) === 'object') {
return this.equals(propA, propB);
}
return propA === propB;
}
return true
}

递归删除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;
}

JS常用的工具方法的更多相关文章

  1. js 常用业务工具方法 (es5,es6)持续更新

    数组去重 数组去重最原始的方法就是使用双层循环. es5: // 使用indexOf function unique(array) { var res = []; for (var i = 0, le ...

  2. 秒味课堂Angular js笔记------Angular js中的工具方法

    Angular js中的工具方法 angular.isArray angular.isDate angular.isDefined angular.isUndefined angular.isFunc ...

  3. JS常用时间处理方法

    这里会扩展一些JS常用时间处理方法,内置时间对象的方法不再赘述 -- 传送门:http://www.w3school.com.cn/js/jsref_obj_date.asp 时间格式化 -- 转换为 ...

  4. JS常用字符串处理方法应用总结

    这篇文章主要总结了JS常用字符串的处理方法,需要的朋友可以参考下   1.indexOf()方法,从前往后查找字符串位置,大小写敏感,从0开始计数.同理,lastIndexOf() 方法从后往前,两个 ...

  5. Angungular.js 的过滤器&工具方法

    字母大小写 数字 货币 截取字符串 截取数组 用JS操作 ----------------------------------------------------------------------- ...

  6. js常用几种类方法实现

    js定义类方法的常用几种定义 1 定义方法,方法中包含实现 function createCORSRequest() { var xhr = new XMLHttpRequest(); xhr.onl ...

  7. js常用的工具函数

    JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1.通过ID选取元素document.getElementById('myid');2.通过CLASS选取元素do ...

  8. javscript 一些常用的工具方法

    一些工作中经常会用到的js代码,可以封装成一个工具库. 积少成多,从现在开始吧! -------------- 1 . 判断一段文字的长度.要求中文相当于2个字符,非中文的相当于1个字符 String ...

  9. Js 常用调试的方法

    A  使用alert() 和document.write() 方法监视变量值 如果要中断代码的运行,监视变量的值,则使用alert() 方法: 如果需要查看的值很多,则使用document.write ...

  10. JavaScript基础 -- js常用内置方法和对象

    JS中常用的内置函数如下: 1.eval(str):计算表达式的结果. 2.parseInt(str,n):将符串转换成整数数字形式(可指定几进制). 3.parseFloat(str):将字符串转换 ...

随机推荐

  1. 【CDS技术揭秘系列 01】阿里云CDS-OSS容灾大揭秘

    ​简介: 本文主要阐述 CDS 产品中 OSS 服务在容灾方面的部署形态以及实现的其本原理. 容灾功能可以保证用户一份数据在多个地方存在冗余备份,当某个机房出现极端异常(比如物理损毁)情况下,数据也不 ...

  2. [Go] golang 执行 Linux 系统 command

    执行系统 shell 命令示例: fileDir := "files/"out, err := exec.Command("sh", "-c" ...

  3. 修改python别名

    修改Python别名 发现课程提供的启动python程序的命令均为python3,而我们的环境中只能用python来启动 Python 解释器,可以通过修改python的别名来实现不同名称调用同一个程 ...

  4. dotnet 6 已知问题 获取 CultureInfo.NumberFormat 可能抛出 IndexOutOfRangeException 异常

    本文记录一个 dotnet 6 已知问题,准确来说这是一个在 dotnet 5 引入的问题,到 dotnet 6.0.12 还没修.在获取 CultureInfo.NumberFormat 属性时,在 ...

  5. Sentinel如何持久化数据到Nacos?

    默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但不能将自己控制台修改的信息同步给 Nacos,如下图所示: 但是在生成环境下,我们为了更方便的操作,是需要将 Sentinel 控制 ...

  6. 通过Ingress-nginx实现灰度发布---灰度发布(22)

    1.通过Ingress-nginx实现灰度发布 场景一: 将新版本灰度给部分用户 假设线上运行了一套对外提供 7 层服务的 Service A 服务,后来开发了个新版本 Service A' 想 要上 ...

  7. ibus 输入法导致输入卡顿的解决方案

    系统: Zorin OS 16 Pro 基于 Ubuntu 20.04 LTS 关键词:Linux 间歇性卡顿.输入法导致卡顿.无法输入 本问题发生的情形是系统间歇性的无法接受键盘输入,无意间发现切换 ...

  8. WPF 稳定的全屏化窗口方法

    本文来告诉大家在 WPF 中,设置窗口全屏化的一个稳定的设置方法.在设置窗口全屏的时候,经常遇到的问题就是应用程序虽然设置最大化加无边框,但是此方式经常会有任务栏冒出来,或者说窗口没有贴屏幕的边.本文 ...

  9. CentOS7部署Redis(离线单机)

    一.检查是否安装 ## 检查是否安装了Redis [root@localhost /]# ps -ef | grep redis ## 存在就删除 [root@localhost /]# sudo y ...

  10. 机器学习策略篇:详解为什么是人的表现?(Why human-level performance?)

    为什么是人的表现? 在过去的几年里,更多的机器学习团队一直在讨论如何比较机器学习系统和人类的表现,为什么呢? 认为有两个主要原因,首先是因为深度学习系统的进步,机器学习算法突然变得更好了.在许多机器学 ...