js常用方法

类型判断

function istype(o, type) {
    if (type) {
        var _type = type.toLowerCase();
    }
    switch (_type) {
        case 'string':
            return Object.prototype.toString.call(o) === '[object String]';
        case 'number':
            return Object.prototype.toString.call(o) === '[object Number]';
        case 'boolean':
            return Object.prototype.toString.call(o) === '[object Boolean]';
        case 'undefined':
            return Object.prototype.toString.call(o) === '[object Undefined]';
        case 'null':
            return Object.prototype.toString.call(o) === '[object Null]';
        case 'function':
            return Object.prototype.toString.call(o) === '[object Function]';
        case 'array':
            return Object.prototype.toString.call(o) === '[object Array]';
        case 'object':
            return Object.prototype.toString.call(o) === '[object Object]';
        case 'nan':
            return isNaN(o);
        case 'elements':
            return Object.prototype.toString.call(o).indexOf('HTML') !== -1;
        default:
            // return Object.prototype.toString.call(o)
            return false;
    }
}

数组 对象 去重方法(一)

function removeRepeatArray(arr, key) {
    var arrResult = [];
    if (this.istype(arr[0], "object") && this.istype(key, "string")) {
        for (var i = 0; i < arr.length; i++) {
            var state = true;
            for (var j = 0; j < arrResult.length; j++) {
                if (arr[i][key] == arrResult[j][key]) {
                    state = false;
                }
            }
            if (state) {
                arrResult.push(arr[i]);
            }
        }
    } else {
        arrResult = arr.filter(function (item, index, self) {
            return self.indexOf(item) === index;
        });
    }
    return arrResult;
}

数组 对象 去重方法(二)

function setArrObj(data) {
      let obj = {};
      return data.reduce((cur, next) => {
        obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
        return cur;
      }, [])
    }

数组(字符串)一个元素出现的次数

function getEleCount(obj, ele) {
    var num = 0;
    for (var i = 0, len = obj.length; i < len; i++) {
        if (ele === obj[i]) {
            num++;
        }
    }
    return num;
}

删除数组中一个元素

function removeArrayForValue(arr, val, type) {
    return arr.filter(function (item) {
        return type ? item.indexOf(val) === -1 : item !== val;
    });
}

获取(对象数组)某些项

function getOptionArray(arr, keys, val) {
    var newArr = [];
    if (!keys) {
        return arr;
    }
    var _keys = keys.split(',');
    if (val) {
        var _vals = val;
        newArr = arr.filter(function (i) {
            var state = _keys.every(function (j, index) {
                if (i[j] == _vals[index]) {
                    return true;
                } else {
                    return false;
                }
            });
            return state;
        });
        return newArr;
    }
    if (_keys.length === 1) {
        for (var i = 0, len = arr.length; i < len; i++) {
            newArr.push(arr[i][keys]);
        }
        return newArr;
    }
    var newArrOne = {};
    for (var i = 0, len = arr.length; i < len; i++) {
        newArrOne = {};
        for (var j = 0, len1 = _keys.length; j < len1; j++) {
            newArrOne[_keys[j]] = arr[i][_keys[j]];
        }
        newArr.push(newArrOne);
    }
    return newArr;
}

数组扁平化

function steamroller(arr) {
    var newArr = [],
        _this = this;
    for (var i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            // 如果是数组,调用(递归)steamroller 将其扁平化
            // 然后再 push 到 newArr 中
            newArr.push.apply(newArr, _this.steamroller(arr[i]));
        } else {
            // 不是数组直接 push 到 newArr 中
            newArr.push(arr[i]);
        }
    }
    return newArr;
}

去空 1-所有空格 2-前后空格 3-前空格 4-后空格

function trim(str, type) {
    switch (type) {
        case 1:
            return str.replace(/\s+/g, "");
        case 2:
            return str.replace(/(^\s*)|(\s*$)/g, "");
        case 3:
            return str.replace(/(^\s*)/g, "");
        case 4:
            return str.replace(/(\s*$)/g, "");
        default:
            return str;
    }
}

检测字符串是否符合类型

email :邮箱 phone :手机号 tel :电话号 number :数值 english :英文 text :文本 chinese :中文 lower :小写 upper :大写
function checkType(str, type) {
    switch (type) {
        case 'email':
            return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
        case 'phone':
            return /^1[3|4|5|7|8][0-9]{9}$/.test(str);
        case 'tel':
            return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
        case 'number':
            return /^[0-9]$/.test(str);
        case 'english':
            return /^[a-zA-Z]+$/.test(str);
        case 'text':
            return /^\w+$/.test(str);
        case 'chinese':
            return /^[\u4E00-\u9FA5]+$/.test(str);
        case 'lower':
            return /^[a-z]+$/.test(str);
        case 'upper':
            return /^[A-Z]+$/.test(str);
        default:
            return true;
    }
}

检测密码强度

0:密码小于6位 1:密码为纯数字 2:密码为数字加小写或者大写字母 3:密码为数字,大小写字母 4:密码为数字,大小写字母,.-_等
function checkPwd(str) {
    var nowLv = 0;
    if (str.length < 6) {
        return nowLv;
    }
    if (/[0-9]/.test(str)) {
        nowLv++;
    }
    if (/[a-z]/.test(str)) {
        nowLv++;
    }
    if (/[A-Z]/.test(str)) {
        nowLv++;
    }
    if (/[\.|-|_]/.test(str)) {
        nowLv++;
    }
    return nowLv;
}

查找字符串,出现在原字符串里的次数

function countStr(str, strSplit) {
    return str.split(strSplit).length - 1;
}

找出最长单词

function longestWord(str, splitType) {
    var _splitType = splitType || /\s+/g,
        _max = 0,
        result = null;
    var strArr = str.split(_splitType);
    strArr.forEach(function (item) {
        if (_max < item.length) {
            _max = item.length;
            result = item;
        }
    });
    return result;
}

实现字符串长度截取,并添加省略符

function cutstr(str, len) {
    var temp;
    var icount = 0;
    var patrn = /[^\x00-\xff]/;
    var strre = "";
    for (var i = 0; i < str.length; i++) {
        if (icount < len - 1) {
            temp = str.substr(i, 1);
            if (patrn.exec(temp) == null) {
                icount = icount + 1;
            } else {
                icount = icount + 2;
            }
            strre += temp;
        } else {
            break;
        }
    }
    return strre + "...";
}

对象扁平化处理

function steamObject(obj) {
    var newObj = {},
        _this = this;
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            var element = obj[key];
            if (_this.istype(element, "object")) {
                var secObj = this.steamObject(element);
                for (var keys in secObj) {
                    if (secObj.hasOwnProperty(keys)) {
                        newObj[keys] = secObj[keys];
                    }
                }
            } else {
                newObj[key] = element;
            }
        }
    }
    return newObj;
}

rem适配

function getFontSize(psdW) {
    var doc = document,
        win = window;
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function recalc() {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            if (clientWidth > psdW) {
                clientWidth = psdW;
            } //设置根元素font-size大小
            docEl.style.fontSize = 100 * (clientWidth / psdW) + 'px';
        }; //屏幕大小改变,或者横竖屏切换时,触发函数
    win.addEventListener(resizeEvt, recalc, false); //文档加载完成时,触发函数
    doc.addEventListener('DOMContentLoaded', recalc, false);
}

手机类型判断

function browserInfo(type) {
    switch (type) {
        case 'android':
            return navigator.userAgent.toLowerCase().indexOf('android') !== -1;
        case 'iphone':
            return navigator.userAgent.toLowerCase().indexOf('iphone') !== -1;
        case 'ipad':
            return navigator.userAgent.toLowerCase().indexOf('ipad') !== -1;
        case 'weixin':
            return navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1;
        default:
            return navigator.userAgent.toLowerCase();
    }
}

到某一个时间的倒计时

function getEndTime(endTime) {
    var startDate = new Date(); //开始时间,当前时间
    var endDate = new Date(endTime); //结束时间,需传入时间参数
    var t = endDate.getTime() - startDate.getTime(); //时间差的毫秒数
    var d = 0,
        h = 0,
        m = 0,
        s = 0;
    if (t >= 0) {
        d = Math.floor(t / 1000 / 3600 / 24) + '天';
        h = Math.floor(t / 1000 / 60 / 60 % 24) + '时';
        m = Math.floor(t / 1000 / 60 % 60) + '分';
        s = Math.floor(t / 1000 % 60) + '秒';
        return [d, h, m, s];
    } else {
        return [];
    }
}

获取当前时间

function getFormetTime(fmt, time) {
    //author: meizz
    var date = time ? new Date(time) : new Date();
    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(fmt)) {
        //RegExp.$1返回上一次正则匹配结果中的子表达式结果,这里是yyyy
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    }

    for (var k in o) {
        if (new RegExp("(" + k + ")").test(fmt)) {
            fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
        }
    }
    return fmt;
}

随机产生颜色

function randomColor() {
    return '#' + Math.random().toString(16).substring(2).substr(0, 6); //写法3
}

随机返回一个范围的数字

function randomNumber(n1, n2) {
    console.log(arguments)
    //randomNumber(5,10)
    //返回5-10的随机整数,包括5,10
    if (arguments.length === 2) {
        return Math.round(n1 + Math.random() * (n2 - n1));
    } //randomNumber(10)
    //返回0-10的随机整数,包括0,10
    else if (arguments.length === 1) {
        return Math.round(Math.random() * n1);
    } //randomNumber()
    //返回0-255的随机整数,包括0,255
    else {
        return Math.round(Math.random() * 255);
    }
}

设置url参数

function setUrlPrmt(obj) {
    var _rs = [];
    for (var p in obj) {
        if (obj[p] != null && obj[p] != '') {
            _rs.push(p + '=' + obj[p]);
        }
    }
    return _rs.join('&');
}

获取url参数

function getUrlPrmt(url) {
    url = url ? url : "";
    var _pa = url.substring(url.indexOf('?') + 1),
        _arrS = _pa.split('&'),
        _rs = {};
    for (var i = 0, _len = _arrS.length; i < _len; i++) {
        var pos = _arrS[i].indexOf('=');
        if (pos == -1) {
            continue;
        }
        var name = _arrS[i].substring(0, pos); // value = window.decodeURIComponent(_arrS[i].substring(pos + 1));
        _rs[name] = _arrS[i].substring(pos + 1);
    }
    return _rs;
}

函数节流

function delayFn(fn, delay, mustDelay) {
    var timer = null;
    var t_start;
    return function () {
      var context = this,
        args = arguments,
        t_cur = +new Date(); //先清理上一次的调用触发(上一次调用触发事件不执行)
        clearTimeout(timer); //如果不存触发时间,那么当前的时间就是触发时间
        if (!t_start) {
            t_start = t_cur;
        } //如果当前时间-触发时间大于最大的间隔时间(mustDelay),触发一次函数运行函数
        if (t_cur - t_start >= mustDelay) {
            fn.apply(context, args);
            t_start = t_cur;
        } //否则延迟执行
        else {
            timer = setTimeout(function () {
            fn.apply(context, args);
            }, delay);
        }
    };
}

两个数组取相同值

        var arr = [1, 2];
        var arr1 = [1, 2, 3];
        var arr2 = [];
        function ArrayDef(arr, arr1) {
            if (arr.length >= arr1.length) {
                arr.forEach(item => {
                    if (arr1.every(it => it != item)) {
                        arr2.push(item)
                    }
                })
            } else {
                arr1.forEach(item => {
                    if (arr.every(it => it != item)) {
                        arr2.push(item)
                    }
                })
            }
            return arr2
        }
        console.log(ArrayDef(arr, arr1))

input 只允许输入数字

<input type="number"  oninput="if(! /^\d+$/.test(this.value)) value=''">
onkeyup="value=value.replace(/[^\d^\.]+/g,'')"  // 只允许输入数字和小数点

服务器时间处理

 function dateFormat(inputstr, showsplit, showweek) {
            //Wed Mar 22 13:38:37 CST 2017
            inputstr = inputstr + ""; //末尾加一个空格
            var date = "";
            var month = new Array();
            month["Jan"] = '01'; month["Feb"] = '02'; month["Mar"] = '03'; month["Apr"] = '04'; month["May"] = '05'; month["Jun"] = '06';
            month["Jul"] = '07'; month["Aug"] = '08'; month["Sep"] = '09'; month["Oct"] = '10'; month["Nov"] = '11'; month["Dec"] = '12';
            var str = inputstr.split(" ");
            date = str[5];
            date += showsplit + month[str[1]] + showsplit + str[2];
            return date;
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348