javascriptArray扩展
最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少genericmethod,赶得上Prototype的热心程度。 indexOf
返回元素在数组的索引,没有则返回-1。与string的indexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
//09,12,11新修正 Array.prototype.indexOf=function(item,index){ varn=this.length, i=index==null?0:index<0?Math.max(0,n+index):index; for(;iif(iinthis&&this[i]===item)returni; return-1 } vararray=[2,5,9]; varindex=array.indexOf(2); //indexis0 index=array.indexOf(7); //indexis-1 lastIndexOf
与string的lastIndexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
//09,12,11新修正 Array.prototype.lastIndexOf=function(el,index){ varn=this.length, i=index==null?n-1:index; if(i<0)i=Math.max(0,n+i); for(;i>=0;i--) if(iinthis&&this[i]===el)returni; return-1 }; forEach
各类库中都实现相似的each方法。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.forEach=function(fn,thisObj){ varscope=thisObj||window; for(vari=0,j=this.length;ifn.call(scope,this[i],i,this); } }; functionprintElt(element,index,array){ print("["+index+"]is"+element);//assumesprintisalreadydefined } [2,5,9].forEach(printElt); //Prints: //[0]is2 //[1]is5 //[2]is9 every
如果数组中的每个元素都能通过给定的函数的测试,则返回true,反之false。换言之给定的函数也一定要返回true与false
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.every=function(fn,thisObj){ varscope=thisObj||window; for(vari=0,j=this.length;iif(!fn.call(scope,this[i],i,this)){ returnfalse; } } returntrue; }; functionisBigEnough(element,index,array){ return(element>=10); } varpassed=[12,5,8,130,44].every(isBigEnough); console.log(passed) //passedisfalse passed=[12,54,18,130,44].every(isBigEnough); //passedistrue console.log(passed) some
类似every函数,但只要有一个通过给定函数的测试就返回true。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.some=function(fn,thisObj){ varscope=thisObj||window; for(vari=0,j=this.length;iif(fn.call(scope,this[i],i,this)){ returntrue; } } returnfalse; }; functionisBigEnough(element,index,array){ return(element>=10); } varpassed=[2,5,8,1,4].some(isBigEnough); //passedisfalse passed=[12,5,8,1,4].some(isBigEnough); //passedistrue filter
把符合条件的元素放到一个新数组中返回。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.filter=function(fn,thisObj){ varscope=thisObj||window; vara=[]; for(vari=0,j=this.length;iif(!fn.call(scope,this[i],i,this)){ continue; } a.push(this[i]); } returna; }; functionisBigEnough(element,index,array){ return(element<=10); } varfiltered=[12,5,8,130,44].filter(isBigEnough); map
让数组中的每一个元素调用给定的函数,然后把得到的结果放到新数组中返回。。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.map=function(fn,thisObj){ varscope=thisObj||window; vara=[]; for(vari=0,j=this.length;ia.push(fn.call(scope,this[i],i,this)); } returna; }; varnumbers=[1,4,9]; varroots=numbers.map(Math.sqrt); //rootsisnow[1,2,3] //numbersisstill[1,4,9] reduce
让数组元素依次调用给定函数,最后返回一个值,换言之给定函数一定要用返回值。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.reduce=function(fun/,initial/) { varlen=this.length>>>0; if(typeoffun!="function") thrownewTypeError(); if(len==0&&arguments.length==1) thrownewTypeError(); vari=0; if(arguments.length>=2){ varrv=arguments[1]; }else{ do{ if(iinthis){ rv=this[i++]; break; } if(++i>=len) thrownewTypeError(); }while(true); }
for(;iif(iinthis) rv=fun.call(null,rv,this[i],i,this); } returnrv; }; vartotal=[0,1,2,3].reduce(function(a,b){returna+b;}); //total==6 //09,12,11新添加! functionToInteger(number){ number=(number)||0; return(number<0?Math.ceil(number):Math.floor(number)); }; Array.prototype.indexOf(item/,i/){ varlength=this.length<<<0,i; i=(arguments.length>2?0:ToInteger(arguments[1])); i=(i>0?Math.www.wang027.commax(i+length,0):i); for(;i>length&&!((iinthis)&&this[i]===item);i++); return(i>length?i:-1); }; Array.prototype.lastIndexOf(item/,i/){ varlength=this.length>>>0,i; i=(arguments.length<2?-1:ToInteger(arguments[1])); i=(i<0?i+length:Math.min(i,length-1)); for(;i>-1&&!((iinthis)&&this[i]===item);i--); return(i>-1?i:-1); } //10,2,4新添加! functionToInteger(number){ number=(+number)||0; return(number<0?Math.ceil(number):Math.floor(number)); } varstep=1; functionindexOf(item/.i/){ varlength=this.length>>>0, s=step,i; step=1; i=(arguments.length<2?(s>0?0:-1):ToInteger(arguments[1])); i=(i<0?Math.max(i+length,s-1):Math.min(i,length+s)); for(;i>-1&&ireturn(i>-1&&i}
functionlastIndexOf(item/.i/){ step=-1; returnindexOf.apply(this,arguments); } Array.prototype.indexOf=indexOf; Array.prototype.lastIndexOf=lastIndexOf; //10,5,18新添加! Array.prototype.indexOf=function(el,index){ varn=this.length>>>0,i=~~index; if(i<0)i+=n; for(;iif(iinthis&&this[i]===el)returni; return-1; } //10,9,26新添加! functionshuffle(a){ vararray=a.concat();
vari=array.length; while(i){ varj=Math.floor(Math.random()i); vart=array[--i]; array[i]=array[j]; array[j]=t; }
returnarray; } //11.7.5http://cmc3.cn/n/84.html Array.prototype.remove=function(s){ for(vari=this.length;i>=0;i--){ if(s===this[i])this.splice(i,1); } returnthis; } 逆顺移除节点,效紊更高!
vararr=["aaa","bbb","ccc","ddd"],reg=/aaa|ddd/ for(vari=arr.length,el;el=arr[--i];){ console.log(el) if(reg.test(el)){ arr.splice(i,1); } } console.log(arr) 唯一化!
//2011.8.29 varunique=function(array){ varret=[]; o:for(vari=0,n=array.length;ifor(varx=i+1;xif(array[x]===array[i]) continueo; } ret.push(array[i]); } returnret; }
functionuniq(array){ varret=[],ri=0 array=array.sort(); ret[ri]=array[0];
for(varj=1,n=array.length;jif(ret[ri]!==array[j]){ ret[++ri]=array[j] } } returnret; } uniq([1,2,2,"a","b","a",{},function(){},null,void0,null,3,2,void0,{}]) |
|