JavaScript常用工具函数库汇总


Posted in Javascript onSeptember 17, 2020

对象或数组的深拷贝

/**
 * 对象或数组的深拷贝
 * @param {*} cloneObj 被克隆的对象
 * @param {*} targetObj 克隆的目标对象
 * @param {*} isOverride 若属性重复,是否覆盖被克隆对象的属性
 */
function deepClone(cloneObj, targetObj, isOverride = true) {
 const _toString = Object.prototype.toString
 if (_toString.call(cloneObj) !== '[object Array]' && _toString.call(cloneObj) !== '[object Object]') {
  return cloneObj
 }
 var cloneTarget = _toString.call(cloneObj) === '[object Array]' ? [] : {}
 for (let key in cloneObj) {
  if (Object.prototype.hasOwnProperty.call(cloneObj, key)) {
   if (_toString.call(cloneObj[key]) === '[object Array]' || _toString.call(cloneObj[key]) === '[object Object]') {
    cloneTarget[key] = deepClone(cloneObj[key])
   } else {
    cloneTarget[key] = cloneObj[key]
   }
  }
 }
 if (targetObj && (_toString.call(cloneObj) === _toString.call(targetObj))) {
  //这里要注意,克隆的目标对象也要deepClone下
  cloneTarget = isOverride
   ? Object.assign(cloneTarget, deepClone(targetObj))
   : Object.assign(deepClone(targetObj), cloneTarget)
 }
 return cloneTarget
}

精准判断数据类型

//精准判断数据类型
function getVerifyDataTypes() {
 const types = ["String", "Number", "Boolean", "Null", "Undefined", "Function", "Object", "Array", "Date", "Error", "RegExp", "Symbol", "Map", "Set"]
 let Type = {}
 // 示例用法:Type.isString('javascript')
 for (let i = 0; i < types.length; i++) {
  Type[`is${types[i]}`] = obj => Object.prototype.toString.call(obj) === `[object ${types[i]}]`
 }
 // 判断字符串是否为json格式
 Type.isJsonStr = str => {
  if (typeof str == 'string') {
   try {
    let obj = JSON.parse(str);
    if (obj && typeof obj == 'object') {
     return true;
    }
    return false;
   } catch (e) {
    return false;
   }
  } else {
   return false;
  }
 }
 return Type
}

日期格式化

/**
 * 日期格式化
 * @param {*} date 日期对象
 * @param {*} beforeHyphen 年月日连字符
 * @param {*} afterHyphen 时分秒连字符
 */
function formatDate(date = new Date(), beforeHyphen = '-', afterHyphen = ':') {
 const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : `0${n}`
 }
 const year = date.getFullYear()
 const month = date.getMonth() + 1
 const day = date.getDate()
 const hour = date.getHours()
 const minute = date.getMinutes()
 const second = date.getSeconds()
 const ymd = [year, month, day].map(formatNumber).join(beforeHyphen)
 const hms = [hour, minute, second].map(formatNumber).join(afterHyphen)
 return `${ymd} ${hms}`
}

把时间戳转换为剩余的天、时、分、秒

/**
 * 把时间戳转换为剩余的天、时、分、秒,一般应用于倒计时场景中
 * @param {*} timestamp 时间戳
 */
function converTimestamp(timestamp) {
 const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : `0${n}`
 }
 let day = Math.floor((timestamp / 1000 / 3600) / 24);
 let hour = Math.floor((timestamp / 1000 / 3600) % 24);
 let minute = Math.floor((timestamp / 1000 / 60) % 60);
 let second = Math.floor(timestamp / 1000 % 60);
 return {
  day: day,
  hour: formatNumber(hour),
  minute: formatNumber(minute),
  second: formatNumber(second)
 }
}

从数组中随机取出一项

// 从数组中随机取出一项
function getRandomItemByArray(items) {
 return items[Math.floor(Math.random() * items.length)];
}

将有父子关系的数组转换成树形结构数据

let data = [
 { parentId: 0, id: 1, value: 'xxx' },
 { parentId: 1, id: 3, value: 'xxx' },
 { parentId: 4, id: 6, value: 'xxx' },
 { parentId: 3, id: 5, value: 'xxx' },
 { parentId: 2, id: 4, value: 'xxx' },
 { parentId: 1, id: 2, value: 'xxx' },
]

// 转换为树形Array结构
function toTreeAry(arr, pId = 0) {
 return arr
  .filter(({ parentId }) => parentId === pId)
  .map(a => ({
   ...a,
   children: toTreeAry(arr.filter(({ parentId }) => parentId !== pId), a.id)
  }))
}

// 转换为树形Object结构
function toTreeObj(arr, pId = 0) {
 let res = {}
 arr.filter(({ parentId }) => parentId === pId)
  .forEach(a => {
   res[a.id] = {
    ...a,
    children: toTreeObj(arr.filter(({ parentId }) => parentId !== pId), a.id)
   }
  })
 return res
}

console.log(toTreeAry(data))
console.log(toTreeObj(data))

生成随机字符串

// 随机字符串
const randomStr = () => {
 return new Date().getTime() + '-' + Math.random().toString(36).substr(2)
}

过滤html标签

// 过滤html标签
const filterHTMLTag = (str) => {
 str = str.replace(/<\/?[^>]*>/g, ''); //去除HTML Tag
 str = str.replace(/[|]*\n/, '') //去除行尾空格
 str = str.replace(/&npsp;/ig, ''); //去掉npsp
 return str;
}

以上就是JavaScript常用工具函数库汇总的详细内容,更多关于JavaScript工具函数库的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js计算页面刷新的次数
Jul 20 Javascript
aspx中利用js实现确认删除代码
Jul 22 Javascript
基于jquery的图片轮播 tab切换组件
Jul 19 Javascript
jquery实现带二级菜单的导航示例
Apr 28 Javascript
jquery图片切换实例分析
Apr 15 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
Jun 13 Javascript
详解基于angular路由的requireJs按需加载js
Jan 20 Javascript
Vue如何实现响应式系统
Jul 11 Javascript
iview实现select tree树形下拉框的示例代码
Dec 21 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
原生JavaScript写出Tabs标签页的实例代码
Jul 20 Javascript
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
el-form 多层级表单的实现示例
Sep 10 #Javascript
详解React的回调渲染模式
Sep 10 #Javascript
vue-cli3项目配置eslint代码规范的完整步骤
Sep 10 #Javascript
关于JavaScript数组去重的一些理解汇总
Sep 10 #Javascript
vue中jsonp插件的使用方法示例
Sep 10 #Javascript
vue 实现一个简单的全局调用弹窗案例
Sep 10 #Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 #Javascript
You might like
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
php实现监听事件
2013/11/06 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
php中动态调用函数的方法
2015/03/16 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
JS 自定义带默认值的函数
2011/07/21 Javascript
js鼠标悬浮出现遮罩层的方法
2015/01/28 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
JS实现简单打字测试
2020/06/24 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
线程和进程的区别及Python代码实例
2015/02/04 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
Python 中@property的用法详解
2020/01/15 Python
Python求凸包及多边形面积教程
2020/04/12 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
营业经理岗位职责
2013/11/10 职场文书
车间组长岗位职责
2013/12/20 职场文书
迎新晚会主持词
2014/03/24 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
教师外出学习心得体会
2016/01/18 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python