javascript中數組去重/排序/搜尋索引

來源:互聯網
上載者:User

我總共想出了四種演算法來實現這個目的:

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<this .length;i++){
                      if(!_a[this[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<b?1:-1});//從大到小排序

 alert(arrDemo);//100,51,50,10

1.數組調用sort方法後,會影響本身(而非產生新數組)

2.sort()方法預設是按字元來排序的,所以在對數字型數組排序時,不可想當然的以為會按數字大小排序!

3.要改變預設的sort行為(即按字元排序),可以自行指定定序函數(如本例所示)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.