常用JS工具函数

1. 前言

1.整理一下 自己平常工作中用到的一些JS工具


2. 随机色

2.1 rgb的形式

当然也可以使用rgba

const randomColor = ()=> {
  var r = randomNumber(0, 255);
  var g = randomNumber(0, 255);
  var b = randomNumber(0, 255);

  return `rgb(${r},${g},${b})`;
}

2.2 十六进制颜色

颜色嘛 英文穷举不合适 ,那就 十六进制随机数

const randomColor = ()=>{
     return  "#" + Math.floor(Math.random()* 0xffffff).toString()
}

3. RGB转为 HEX

  const rgbToHex = (r,g,b)=>{
         const toHex = num=>{
             const hex = num.toString(16)
             return hex.length === 1 ?  `0${hex}` :hex
         }
         return `#${toHex(r)}${toHex(g)}${toHex(b)}`
     }

4.日期格式化 -1

const formatNumber = n => {
    n = n.toString()
    return n[1] ? n : `0${n}`
}
const formatTime = date => {
    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()

    return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`
}

根据自己的需求灵活变化就行



4.2 时间格式化 -2

export function formatDate (date, fmt) {
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  }
  let o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'h+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds()
  }
  for (let k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      let str = o[k] + ''
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str))
    }
  }
  return fmt
}

function padLeftZero (str) {
  return ('00' + str).substr(str.length)
}


4.3 时间格式化无符号拼接

export function nosignDateTime (date) {
  var datetime = transferDateTime(date)
  datetime = datetime.replace(/:/g, '').replace(/-/g, '').replace(/ /g, '')
  datetime = parseInt(datetime)
  return datetime
}


5. 返回最小日期

const getMinDate = dates => {
    if (!dates) {
        throw new Error('参数类型不匹配!')
    }
    if (!dates.length) {
        return dates
    }
    return new Date(Math.min.apply(null, dates)).toISOString()
}

参数是日期数组


6. 判断yyyy-MM-dd hh:mm:ss格式

正则表达式

export function validateDateTime (testdate) {
  var dateRegex = /((19|20)[0-9]{2})-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/
  var res = dateRegex.test(testdate)
  if (res) {
    var ymd = testdate.match(/(\d{4})-(\d+)-(\d+).*/)
    var year = parseInt(ymd[1])
    var month = parseInt(ymd[2])
    var day = parseInt(ymd[3])
    if (day > 28) {
      // 获取当月的最后一天
      var lastDay = new Date(year, month, 0).getDate()
      return (lastDay >= day)
    }
    return true
  }
  return false
}

7. 比较时间大小

  compareTime(beginTime, endTime) {
        var beginTimes = beginTime.replace(/-/g, "/");
        var endTimes = endTime.replace(/-/g, "/");
        var a = (Date.parse(endTimes) - Date.parse(beginTimes)) / 3600 / 1000;
        if (a < 0) {
            console.log("endTime小!");
        } else if (a > 0) {
            console.log("endTime大!");
        } else if (a == 0) {
            console.log("相等!");
        }
        return a;
    },

8.数字补0

const formatNumber = n => {
    n = n.toString()
    return n[1] ? n : `0${n}`
}

padStart

// '010'
"10".padStart(3,0)   
//'10a'
"10".padEnd(3,"a")

参数1: 字符串长度
参数2: 字符串长度不够用 指定字符进行补充
padEnd 末尾补充


9.数组去重

  const quChong = (arr)=>{
    return [...new Set(arr)]
  }

10. 数组打乱顺序

const disorderArr = array => {
    if (!Array.isArray(array)) {
        throw new Error('参数不匹配')
    }
    let end = array.length
    if (!end) {
        return array
    }
    while (end) {
        let start = Math.floor(Math.random() * end--)
        ;[array[start], array[end]] = [array[end], array[start]]
    }
    return array
}

参数:数组类型的数组


10.2 数组打乱顺序 -简洁

let arr = [32,6,4,'😄',true,'666',false,'2022年5月30号']
  arr = arr.sort(()=>0.5-Math.random())
  1. 数组自带的排序
  2. 随机数

11. 查找在数组中的位置

 /**
     *
     * @param arr
     * @param str 查找在数组中的位置
     * @returns {number}
     */
 arrayIndexOf =(arr, str)=> {
        // 如果可以的话,调用原生方法
        if (arr && arr.indexOf) {
            return arr.indexOf(str);
        }

        var len = arr.length;
        for (var i = 0; i < len; i++) {
            // 定位该元素位置
            if (arr[i] == str) {
                return i;
            }
        }
        // 数组中不存在该元素
        return -1;
    }

12. 数组随机生产一个值

let arr = [32,6,4,'😄',true,'666',false,'2022年5月30号']
const randomElement = (arr)=>arr[Math.floor(Math.random()*arr.length)]

randomElement(arr)

13. 文件尺寸格式化

const formatSize = size => {
    if (typeof +size !== 'number') {
        throw new Error('参数不对 !')
    }
    const unitsHash = 'B,KB,MB,GB'.split(',')
    let index = 0
    while (size > 1024 && index < unitsHash.length) {
        size /= 1024
        index++
    }
    return Math.round(size * 100) / 100 + unitsHash[index]
}
formatSize('10240') // 10KB
formatSize('10240000') // 9.77MB

14.连字符转驼峰

const toCamelCase = (str = '', separator = '-') => {
    if (typeof str !== 'string') {
        throw new Error('参数类型不对')
    }
    if (str === '') {
        return str
    }
    const newExp = new RegExp('\\-\(\\w\)', 'g')
    return str.replace(newExp, (matched, $1) => {
        return $1.toUpperCase()
    })
}
toCamelCase('java-script')//javaScript'

15.驼峰转连字符

const fromCamelCase = (str = '', separator = '-') => {
    if (typeof str !== 'string') {
        throw new Error('参数类型不对')
    }
    if (str === '') {
        return str
    }
    return str.replace(/([A-Z])/g, `${separator}$1`).toLowerCase()
}


fromCamelCase('javaScript') // java-script

16. 深浅拷贝

  1. js深浅拷贝

17. Unicode转中文

export function unicodeToChinese (str) {
  return unescape(str.replace(/&#x/g, '%u').replace(/;/g, ''))
}

18. 浏览器高度

 const clientHeight = ()=> {
  return window.innerHeight || document.documentElement.clientHeight;
}

19.上滚动距离 文档滚动的高度

  const getScroTop = ()=> {
  return document.documentElement.scrollTop;
}

20. 元素距离顶部距离

const  getoffsetTop = ele=> {
  var top = 0;
  while (true) {
    top = top + ele.offsetTop + ele.offsetParent.clientTop;
    ele = ele.offsetParent;
    // ele是body 的时候 ,就到顶了
    if (ele.offsetParent == null) {
      break;
    }
  }
  return top;
}

21. 手机号中间四位 变为*

也就是脱敏处理

let phone = "186929398753"
//186****8753
phone.toString().replace(/^(\d{3})\d{4}(\d{4})$/ ,'$1****$2')

22. 校验数据类型

const typeOf = (obj)  =>{
  return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
}
typeOf('yzs')  // string
typeOf([])  // array
typeOf(new Date())  // date
typeOf(null) // null
typeOf(true) // boolean
typeOf(() => { }) // function

23. 阿拉伯数字转中文数字

const numToChinese = (num) =>{
    if (!/^\d*(\.\d*)?$/.test(num)) {
        alert("Number is wrong!");
        return "Number is wrong!";
    }
    var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");
    var BB = new Array("", "十", "百", "千", "万", "亿", "点", "");
    var a = ("" + num).replace(/(^0*)/g, "").split("."),
        k = 0,
        re = "";
    for (var i = a[0].length - 1; i >= 0; i--) {
        switch (k) {
            case 0:
                re = BB[7] + re;
                break;
            case 4:
                if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
                    re = BB[4] + re;
                break;
            case 8:
                re = BB[5] + re;
                BB[7] = BB[5];
                k = 0;
                break;
        }
        if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re;
        if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re;
        k++;
    }
    if (a.length > 1) //加上小数部分(如果有小数部分) 
    {
        re += BB[6];
        for (var i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
    }
    return re;
};

参考资料

部分代码是在网上搜索,根据我自己的开发需求进行了修改,但是时间久了也忘记在哪看的😭😭,如有侵权,请告知 我会删除


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容