js实用方法

129 阅读2分钟

一.根据对象的value找到该对象对应的key

findObjectKeyByValue( value, compare = (a, b) => a===b) { 
       return Object.keys(obj).find( k => compare(obj[k], value)
)}

使用到的js基本知识点:

a.Object.keys()方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。

b.数组的find() 方法返回通过测试(函数内判断)的数组的第一个元素的值。find() 方法为数组中的每个元素都调用一次函数执行:

  • 当数组中的元素在测试条件时返回true时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
  • 如果没有符合条件的元素返回 undefined

注意: 1. find() 对于空数组,函数是不会执行的。2. find() 并没有改变数组的原始值。

二.截断字符串(考虑有表情符号的情况)

formateNoteInfo( note: string, length: number) {
    note = note.replace("\n", '');   
    note = note.replace(/\ /g, "")    
    if (note.length > length) {        
        let str: string = note.substr(0, length);      
        let reg: any = /[\u4e00-\u9fa5]/;//汉字        
        let reg2: any = /[0-9a-z]/i;//        
        let reg3: any = /[\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]/;//中文标点符号        
        let reg4: any = /[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]/;//英文符号        
        let k: number = 0;//既不是中文也不是数字和英文字符的个数        
        for(let i=0;i<length;i++) {               
            if (!reg.test(str[i]) && !reg2.test(str[i]) && !reg3.test(str[i]) && !reg4.test(str[i])) { 
                   k++;                
            }            
        }            
        if (k%2==0)//截断部分表情时完整的               
               return str + '...';           
         else {//截断部分表情不完整,需求再多截取一个字符               
                return note.substr(0, length + 1) + '...';       
             }  
        } else return note; 
}

截取到表情的一半时,显示到页面上的是乱码,所以得保证截取到的部分表情符号占据偶数个字节

三.获取URL中指定参数的值

getParamOfURL(name: string) {
        var reg: any = new RegExp("(|&)"+ name + "=([^&]*)(&|$)");   
        var r = window.location.search.substr(1).match(reg);        
        if (r!=null) {            
             return decodeURI(r[2]);    
        }     
        return null;
}

四.一行显示2列(每列代表一种数据),不满足条件的数据不显示(比如数字为0)

解决思路:

  1. 先筛选出需要显示出来的数据,并将其放在一个数组中;
  2. 然后将数据以对象的形式保存到一个新的数组中,一行有n列那么数组的每一个元素就需要放在n个对象(最后一个元素可能少于n个元素);
  3. 最后在HTML中遍历这个数组中的数据就可以了(遍历时数组中的每一个元素就代表着一行的数据)

五.获取近30天的日期并返回数组

  getRecent30Days() {//获取前30天的日期
        let nowDate = new Date();
        let oldDate = new Date(nowDate);
        let xLabels: any = [];
        for (let i = 0; i < 30; i++) {
            oldDate.setDate(nowDate.getDate() - 30 + i);
            xLabels.push(oldDate.getDate() + '/' + (oldDate.getMonth() + 1));
            oldDate = new Date(nowDate);
        }
        return xLabels
    }

六.统计字符个数(中文算两个字符,其余的算一个字符)

//统计字符串中的字符数(中文算两个)
statisticChar(str) {
    let len = 0;
    for(let i=0;i<str.length;i++) {
        if (str.charCodeAt(i) > 256) {
            len += 2;
        } else len += 1; 
    }
}



//检查字符串中是否有中文字符
function isChinese(str){
    var RegExp = new RegExp('[\\u4E00-\\u9FFF]','g');
    return RegExp.test(str);       
}