工作中常用的js函数

原创 2013年12月04日 23:43:50

计算字符长度:

function len(s) {
    var l = 0;
    var a = s.split("");
    for (var i = 0; i < a.length; i++) {
        if (a[i].charCodeAt(0) < 299) {
            l++;
        } else {
            l += 2;
        }
    }
    return l;
}

删除字符两边的空白、空格

var STR = STR || {
        //去掉字符串前后的空格
        trim : function(str,pos){
                if(pos==='left' || pos==='l' || pos==='L'){
                        return str.replace(/(^\s*)/, "");
                }
                if(pos==='right' || pos==='r' || pos==='R'){
                        return str.replace(/(\s*$)/, "");
                }
                return str.replace(/(^\s*)|(\s*$)/, "");
        }
}


数组去重

方法一

function uniqueArr(array) {
		var res={};
		var newArr=[];
		for(var i=0,l=array.length;i<l;i++) {
			if(typeof res[array[i]] == "undefined"){
				res[array[i]]=1;
				newArr.push(array[i]);
			}
		}
		return newArr;
	}

方法二

/**
 *去除数组中重复的元素
把元素的值存为一个新数组的key,key是不可以重复的,然后变量次数组即可
 */
function unique(data) {
    data = data || [];
    var a = {};
    len = data.length;
    for (var i = 0; i < len; i++) {
        var v = data[i];
        if (typeof(a[v]) == 'undefined') {
            a[v] = 1;
        }
    };
    data.length = 0;
    for (var i in a) {
        data[data.length] = i;
    }
    return data;
}
alert(unique([12,12,12,34]));


var arr=[1,2,2,3,'5',6,5,'',' ']

这个数组只包含了数字,字符串两种类型。我们给数组原型上面添加去重的方法distinct,用第一种很容易想到的方法来实现,当然也是很笨很直接的,把这个数组复制一份然后循环两个数组,对比当前值与后面所有的值是否相等,如果与后面所有值都不等则把该值存到新数组里,如此最后再返回该新数组。方法如下:

复制代码
//第一种方法 Array.prototype.distinct=function(){ var clone,newArr=[],n=0; if(this.length<2)return; clone=this; for(var i=0,len=this.length;i<len;i++){ for(var j=i+1,len2=clone.length;j<len2;j++){ if(this[i]!==clone[j]){ n++; } } if(n==(len-i-1)){ newArr.push(this[i]) } n=0; } return newArr; } console.log([1,2,2,3,'5',6,5,'',' '].distinct());
复制代码

基本可以满足我们的需求,对这样简单的类型比较确实不用费太多的脑经,但如果数组很长呢?如此遍历数组,数组长度为n,那么时间复杂度为n*n。显然该方法性能还有待提升。接下来是第二种方法,用到数组排序,在排序的过程去除重复的值。

复制代码
//第二种方法 Array.prototype.distinct=function(){ var newArr=this.concat().sort(),self=this; newArr.sort(function(a,b){ var n; if(a===b){ n=self.indexOf(a); self.splice(n,1); } }); return self; } console.log([1,2,2,3,'5',6,5,6,6,15,5,'5',5,'',' '].distinct());
复制代码

这样代码看起来似乎短了很多,甚至连一个for循环都没有,但是sort得效率也高不到哪里去。再来看看第三种实现方法,用到的对象属性不会重名的原理

复制代码
//第三种方法 Array.prototype.distinct=function(){ var newArr=[],obj={}; for(var i=0,len=this.length;i<len;i++){ if(!obj[this[i]]){ newArr.push(this[i]); obj[this[i]]='new'; } } return newArr; } console.log([1,2,2,3,'5',6,5,6,6,15,5,'5',5,'',' '].distinct());
复制代码

第三种方法运行看下结果,会发现跟上面的方法实现的结果不一致,细看原来它把数字5和字符串5当成重复的值给去掉了。看来类型必须保存起来然后再判断是否相等,这样便有了下面的第三种方法的补充版

复制代码
//第三种方法补充版 Array.prototype.distinct=function(){ var newArr=[],obj={}; for(var i=0,len=this.length;i<len;i++){ if(!obj[typeof(this[i])+this[i]]){ newArr.push(this[i]); obj[typeof(this[i])+this[i]]='new'; } } return newArr; }
复制代码

上面举的例子是很简单的类型,我们拿更复杂的类型来测试一下

console.log([1,null,2,{a:'vc'},{},'5',6,5,6,{a:'vv'},15,5,'5',5,'',' ',[1],[1],[1,2],,].distinct());

发现{a:'vc'},{},{a:'vv'}这些不同的对象还是会被剔除掉,如果数组里面有对象则要继续遍历对象里面的属性和值,继续第三种方法的加强

复制代码
//第三种方法加强版 Array.prototype.distinct=function(){ var sameObj=function(a,b){ var tag = true; if(!a||!b)return false; for(var x in a){ if(!b[x]) return false; if(typeof(a[x])==='object'){ tag=sameObj(a[x],b[x]); }else{ if(a[x]!==b[x]) return false; } } return tag; } var newArr=[],obj={}; for(var i=0,len=this.length;i<len;i++){ if(!sameObj(obj[typeof(this[i])+this[i]],this[i])){ newArr.push(this[i]); obj[typeof(this[i])+this[i]]=this[i]; } } return newArr; }
复制代码

用上面的例子测试发现基本木有问题,当然测试还可以更加变态更加纠缠,这里就不去深究了,目前来看此篇方法在网上属于比较齐全的,如果有更好更完善的方法请不吝赐教。

====================================

方法四

Array.prototype.uniq = function () {
  var arr = [];
  var flag = true;
  this.forEach(function(item) {
    // 排除 NaN (重要!!!)
    if (item != item) {
      flag && arr.indexOf(item) === -1 ? arr.push(item) : '';
      flag = false;
    } else {
      arr.indexOf(item) === -1 ? arr.push(item) : ''
    }
  });
  return arr;
}

验证:[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq()


方法五(es6)

Array.prototype.uniq = function() {
  return Array.from(new Set(this));
}
或者 
Array.prototype.uniq = function() {
  return [...new Set(this)];
}




删除数组中指定的元素

/**
 * 参考实例
foreach = function (obj, insp){
  if(obj== null && obj.constructor != Array){
  return [];
}
//obj是要处理的数组,obj==null 表示对象尚未存在;obj.constructor != Array 表示对象obj的属性的构造函数不是数组;
//constructor属性始终指向创建当前对象的构造函数。两个条件均满足,则返回空数组[];

//下面对constructor属性作进一步了解。
var obj= [1, 2, 3, 4]; // 等价于 var obj= new Array(1, 2, 3, 4);
console.log(obj.constructor === Array); // 返回true 表明obj的构造函数为Array;

var foo= function() { }; // 等价于 var foo = new Function();
console.log(foo.constructor === Function); // 返回true 表明foo的构造函数为Function;

var obj = new Foo();  //由构造函数实例化一个obj对象
console.log(obj.constructor === Foo); // 返回true 表明obj的构造函数为Foo;

 */

//删除数组中指定的元素
function del(val, arr)
{
    //检测参数
    if (arr == null && arr.constructor != Array) {
        return [];
    }
    
    var newarr = []; //不存在的保存到新数组中
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] != val)
            newarr.push(arr[i]);
    }
    return newarr;
}
alert(del(2, [1, 2, 3, 4, 5, 2]));

删除数组指定下标的元素

/**
 *删除数组的指定下标元素 
 *
 * i 的值是一直在变的,n的值是只有if条件成立的时候才会变(会依次递增)
 */
Array.prototype.remove=function(dx)
  {
    if(isNaN(dx)||dx>this.length){return false;}
    for(var i=0,n=0;i<this.length;i++)
    {
        if(this[i]!=this[dx])
        {
            this[n++]=this[i]
        }
    }
    this.length-=1
  }

var arr = [1,2,3,4,2,5];
alert(arr);
arr.remove(2);

alert(arr);

常用js函数1

常用函数2

工作中常用的Linux命令

工作中,常用的命令,进行总结下。 场景1:大张负责线上一个服务,使用java语言开发的。有一天,他收到报警,大概意思就是服务不能用,这个时候,老板让他查下是什么原因? 下面是大张的处理过程? ...
  • a236209186
  • a236209186
  • 2017年02月17日 16:41
  • 496

常用js函数--个人项目总结

chatRecordsListHTML = chatRecordsListHTML.replace(/\/g,'"/>'); \S 非空字符串 //发送消息成功,添加到消息框 chatRecord...
  • curiouslearnerdhh
  • curiouslearnerdhh
  • 2015年06月16日 17:04
  • 928

js常用内置函数

摘要:JavaScript是一种灵活的语言,这有时使它名声较差,但是往好的一面看,它也向您提供了快速、创造性地编写代码的能力。它提供的属性和方法仅仅是可以实现功能的开始是您的想象力创建了自定义功能。因...
  • u012169411
  • u012169411
  • 2013年09月18日 18:32
  • 2904

工作中常用到的Java反射

这次提到的Java反射涉及的代码比较多。因为工作中经常用到反射,对代码做了很多抽象以及过滤器。虽然代码量很多,但是简单易用,过滤插件也易修改。 下面介绍下工作中哪些地方比较容易用到反射。比如插件...
  • AlbenXie
  • AlbenXie
  • 2017年04月10日 17:44
  • 219

js、jQuery中常用的一些方法

js、jQuery里的一些常用的的方法总结         jQuery其实就是对js,Ajax的封装,在做项目是必不可少的,验证,异步请求什么的都需要用到。在学习的时候遇到很多不知道的,那就百度...
  • zeng_huabin
  • zeng_huabin
  • 2015年09月20日 14:50
  • 921

js工作中用过的函数

/* 检查长度 */ var emailFlag = false; var userNameFlag = false; var userNameAjax = 0; var pwdFlag = fals...
  • kongjiea
  • kongjiea
  • 2014年04月10日 16:11
  • 1811

001 - *VUE.JS常用函数大全*(基础)

*VUE.JS常用函数大全*(基础)
  • liguanjie8
  • liguanjie8
  • 2017年07月11日 10:12
  • 211

工作中的几种设计模式

1.单例模式synchronized public static ImCache getInstance (Context context) { if (sInstance == nu...
  • shcalm
  • shcalm
  • 2015年04月01日 20:49
  • 2267

工作中常用 的自定义函数

  • codeDig
  • codeDig
  • 2017年06月17日 17:57
  • 219

JS里面几个实用的封装函数

一滚轮事件的封装函数 function MouseWheelHandle (obj,handle){     var info = navigator.userAgent;     var ...
  • a1079049425
  • a1079049425
  • 2016年11月03日 19:29
  • 3232
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工作中常用的js函数
举报原因:
原因补充:

(最多只允许输入30个字)