配色: 字号:
javascript Array扩展
2016-09-19 | 阅:  转:  |  分享 
  
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,{}])
献花(0)
+1
(本文系thedust79首藏)