我总共想出了四种算法来实现这个目的:
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){ } var a = [10,15,3,4,5,6,7,8,9,3,8,9]; |
数组排序
代码如下 | 复制代码 |
var arrDemo = new Array(); arrDemo[0] = 10; 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行为(即按字符排序),可以自行指定排序规则函数(如本例所示)