forEach用法:
var a="2,78,5,6,87,34,65,23,5,22,67,889,3,45,78,3,453545434,323232,25656565,333334,222222222";
//用空间换时间算法
function sortA(s){
var ary=s.split(",");
var temp=[];
var result=[];
ary.forEach(function(item){
if(temp[item]==undefined){
temp[item]=1;
}else{
temp[item]++;
}
});
temp.forEach(function(item,index){
while(item-->0){
result.push(index);
}
})
return result.join(",");
}
alert(sortA(a));
for in用法:
var a="2,78,5,6,87,34,65,23,5,22,67,889,3,45,78,3,453545434,323232,25656565,333334,222222222";
//用空间换时间算法
function sortA(s){
var ary=s.split(",");
var temp=[];
var result=[];
for(var i in ary){
if(temp[ary[i]]==undefined){
temp[ary[i]]=1;
}else{
temp[ary[i]]++;
}
}
for(var i in temp){
while(temp[i]-->0){
result.push(i);
}
}
return result.join(",");
}
alert(sortA(a));
for(;;)用法:
var a="2,78,5,6,87,34,65,23,5,22,67,889,3,45,78,3,453545434,323232,25656565,333334,222222222";
//用空间换时间算法
function sortA(s){
var ary=s.split(",");
var temp=[];
var result=[];
for(var i=0;i<ary.length;i++){
if(temp[ary[i]]==undefined){
temp[ary[i]]=1;
}else{
temp[ary[i]]++;
}
}
for(var i=0;i<temp.length;i++){
if(temp[i]!=undefined){
while(temp[i]-->0){
result.push(i);
}
}
}
return result.join(",");
}
alert(sortA(a));
结果 forEach和for(;;)及其慢,但最终还是会出结果,for in瞬间出结果
原因是for in遍历的时候会跳过值为undefined的数组项;for(;;)遍历了数组的所有项
对于forEach
var a=[];
a[100]=1;
a.forEach(function(item){
console.log(item);
});
控制台只输出了1;表面上来看forEach也跳过了值为undefined的数组;但是这并不表示forEach方法没有遍历所有数组项;因为forEach是数组对象的一个方法,实现此方法的代码遍历了数组的所有项,只是判断数组项的值为undefined就不做处理(处理即为执行传入函数);
用js,对于这种简单数值排序有没有更好的方法了?
当然有:
ary.sort(function(a,b){
return Number(a)>Number(b)?1:(a==b?0:-1);
});
哈哈 没事不要用自己写的排序,特殊情况除外,js源生的排序都是用c编写的,效率那叫一个快;
这里主要弄清下平时常用的几个循环的细微差距。