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 相关文章推荐
jquery如何通过name名称获取当前name的value值
Dec 20 Javascript
jQuery截取指定长度字符串代码
Aug 21 Javascript
深入探讨前端框架react
Dec 09 Javascript
JavaScript观察者模式(经典)
Dec 09 Javascript
浅谈js里面的InttoStr和StrtoInt
Jun 14 Javascript
js防刷新的倒计时代码 js倒计时代码
Sep 06 Javascript
使用Fullpage插件快速开发整屏翻页的页面
Sep 13 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
Sep 19 jQuery
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
微信小程序实现弹出层效果
May 26 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
Jul 28 Javascript
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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
Ajax PHP简单入门教程代码
2008/04/25 PHP
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
php curl发送请求实例方法
2019/08/01 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
js自动生成对象的属性示例代码
2013/10/28 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
Vue3.0数据响应式原理详解
2019/10/09 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Flask框架单例模式实现方法详解
2019/07/31 Python
django将数组传递给前台模板的方法
2019/08/06 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
华为c/c++笔试题
2016/01/25 面试题
快餐店的创业计划书范文
2014/01/29 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
个人租房协议书样本
2014/10/01 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
大学生毕业评语
2014/12/31 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
python ansible自动化运维工具执行流程
2021/06/24 Python