我总共想出了四种算法来实现这个目的:
1.
代码如下 Array.prototype.unique1 = function(){
var n = []; //一个新的临时数组
for(var i = 0; i < this.length; i++) //遍历当前数组
{
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if (n.indexOf(this[i]) == -1) n.push(this[i]);
}
return n;
}
2.
代码如下 Array.prototype.unique2 = function(){
var n = {},r=[]; //n为hash表,r为临时数组
for(var i = 0; i < this.length; i++) //遍历当前数组
{
if (!n[this[i]]) //如果hash表中没有当前项
{
n[this[i]] = true; //存入hash表
r.push(this[i]); //把当前数组的当前项push到临时数组里面
}
}
return r;
}
3.
代码如下 Array.prototype.unique3 = function(){
var n = [this[0]]; //结果数组
for(var i = 1; i < this.length; i++) //从第二项开始遍历
{
//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
//那么表示第i项是重复的,忽略掉。否则存入结果数组
if (this.indexOf(this[i]) == i) n.push(this[i]);
}
return n;
}
4//数组去重
代码如下 Array.prototype.distinct = function(){var filtered= [];
var _a = {};
for(var i = 0;i
_a[this[i]] = 1;
filtered.push(this[i])
}
}
return filtered;
};
//二分法 寻找索引
代码如下function search (arr,item,lower,upper){
lower = lower || 0;
upper = upper || arr.length-1;
if(lower == upper){
if(item == arr[upper]){
return upper;
}else{
return -1;
}
}else{
var middle = parseInt((lower+upper)/2);
if(item > a[middle]){
return search (arr,item,middle+1,upper);
}else{
return search (arr,item,lower,middle);
}
}
}
var a = [10,15,3,4,5,6,7,8,9,3,8,9];
a = a.distinct(); //[10, 15, 3, 4, 5, 6, 7, 8, 9]
a.sort(function(a,b){ return a-b;}); //排序 [3, 4, 5, 6, 7, 8, 9, 10, 15]
alert(search(a,9)); //6
数组排序
代码如下var arrDemo = new Array();
arrDemo[0] = 10;
arrDemo[1] = 50;
arrDemo[2] = 51;
arrDemo[3] = 100;
arrDemo.sort(); //调用sort方法后,数组本身会被改变,即影响原数组
alert(arrDemo);//10,100,50,51 默认情况下sort方法是按ascii字母顺序排序的,而非我们认为是按数字大小排序
arrDemo.sort(function(a,b){return a>b?1:-1});//从小到大排序
alert(arrDemo);//10,50,51,100
arrDemo.sort(function(a,b){return a
alert(arrDemo);//100,51,50,10
1.数组调用sort方法后,会影响本身(而非生成新数组)
2.sort()方法默认是按字符来排序的,所以在对数字型数组排序时,不可想当然的以为会按数字大小排序!
3.要改变默认的sort行为(即按字符排序),可以自行指定排序规则函数(如本例所示)
javascript学习指南_javascript中数组去重/排序/搜索索引
http://m.bbyears.com/jiaocheng/36945.html
推荐访问: