Rumah  >  Artikel  >  hujung hadapan web  >  Pelbagai kaedah untuk mencapai deduplikasi tatasusunan dalam kemahiran javascript_javascript

Pelbagai kaedah untuk mencapai deduplikasi tatasusunan dalam kemahiran javascript_javascript

WBOY
WBOYasal
2016-05-16 15:10:541332semak imbas

Tiada omong kosong lagi, mari terus kepada perkara praktikal!

Mari kita bincangkan tentang keperluan contoh ini dahulu: tulis kaedah untuk mencapai penduaan tatasusunan. (Keperluan: Jalankan kaedah, lulus tatasusunan, kembalikan tatasusunan baharu selepas penyahduplikasian, tatasusunan asal kekal tidak berubah, hanya satu lapisan gelung boleh digunakan semasa proses pelaksanaan, gelung bersarang dua lapisan juga boleh ditulis, untuk rujukan sahaja) ;

Mula-mula, izinkan saya menerangkan kepada pemula apa itu deduplikasi tatasusunan (langkau untuk veteran): ia bermaksud mengalih keluar elemen pendua dalam tatasusunan, contohnya, var arr = [3,2,4,2,1,2]; Tatasusunan baharu yang diperoleh dengan menyahduplikasi tatasusunan ialah [3,2,4,1], yang merupakan fungsi sedemikian.

Kaedah pelaksanaannya agak mudah, dan terdapat banyak cara untuk melaksanakannya ia. Prinsip pelaksanaan, okey, mari kita lihat kaedah pelaksanaan pertama:

Kaedah pertama ialah mengalih keluar pendua dengan melintasi tatasusunan baharu

var arr = [1,'b','b',4,3,3,4,5,1];
     
    //第一种
    Array.prototype.unique1 = function(){
      var arr1 = []; //定义一个新数组
      for(var i=0;i<this.length;i++){
        if(arr1.indexOf(this[i]) == -1){//判断目标数组中在原数组里是否存在
          arr1.push(this[i]);
        } 
      } 
      return arr1;
    }
    console.log(arr); //[1,'b','b',4,3,3,4,5,1]
    console.log(arr.unique1()); //[1, "b", 4, 3, 5]
    //这种方法的主要思路就是,新建一个数组,然后在原数组中,从第一个开始,看看新数组里面有没有这个元素,如果有,就忽略,然后进行下一个,如果没有,则把这个元素存到新数组里面,
    //也就是说,每一次比较,都会遍历新数组,直到找到相同元素为止,比较耗性能

Jika anda tidak biasa dengan kaedah penulisan ini, anda boleh menukarnya kepada kaedah penulisan berikut, kesannya adalah sama:

var arr = [1,'b','b',4,3,3,4,5,1];

function unique1(arr){
      var arr1 = [];
      for(var i=0;i<arr.length;i++){
        if(arr1.indexOf(arr[i]) == -1){//判断目标数组中在原数组里是否存在
          arr1.push(arr[i]); 
        } 
      } 
      return arr1;
    }
    console.log(arr); //[1,'b','b',4,3,3,4,5,1]
    console.log(unique1(arr)); //[1, "b", 4, 3, 5]

Saya tidak akan menulis semula kaedah berikut. Anda boleh menulis semula mengikut format di atas >

Jenis kedua dicapai melalui jadual hash (konsep ini agak besar, prinsip khusus tidak akan dihuraikan di sini. Saya akan menulisnya secara berasingan apabila saya mempunyai masa. Ini adalah perkara yang baik)

var arr = [1,'b','b',4,3,3,4,5,1];

Array.prototype.unique2 = function(){
      var hash = {}; //定义一个hash表
      var arr1 = []; //定义一个新数组
      for(var i=0;i<this.length;i++){
        /*
          这里比较难理解,我们一步一步来看:
          hash是一个对象,则存在键值对(key:value),只不过现在是为空的,所以hash[key] = value;
          第一步:i=0;this[i]=this[0]=1; hash[this[0]] = hash[1] , 因为hash初始为空,没有找到key=1的值,所以然后undefined,
          执行下一步:hash[1] = true(此时hash对象就有了第一组键值对),将原数组的第一个数添加到新数组中,重复第一步
          因为不重复的判断hash的值都是undefined,而重复的都为true了,所以不重复都被添加到新数组中
          因为hash表存的值是存的地址,放在堆内存中,所以有多少个不重复的元素,就要分多少个内存来存放,所以这种方法比较占内存,但是相比之下,这种的运算运动是最快的,
          这也就是用空间来换取时间了,数据量比较小,推荐用此方法
        */
        if(! hash[this[i]]){
          hash[this[i]] = true;
          arr1.push(this[i]);
        }
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique2());

Kaedah ketiga dicapai dengan merentasi sama ada kedudukannya sendiri konsisten

var arr = [1,'b','b',4,3,3,4,5,1];

Array.prototype.unique3 = function(){
      var arr1 = []; //定义一个新数组
      for(var i=0;i<this.length;i++){
        if(this.indexOf(this[i])==i){
        //这里也是indexOf遍历,看从第一个元素在原数组中的位置,如果第一次出现的位置和下标相等,说明当前元素的不重复的,如果不等,说明该元素前面已经出现过
          arr1.push(this[i]);
        }
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique3());

Kaedah keempat, yang agak menarik, hanya boleh digunakan dalam majlis-majlis khas Ia adalah untuk mengisih tatasusunan dahulu, kemudian membandingkan 22, dan mengeluarkan tatasusunan diisih baharu

Array.prototype.unique4 = function(){
      /*
        这里是思路是,先排序(默认从小到大),然后将原数组的第一个给新数组,
        因为是经过排序的,所以重复的只会存在在相邻位置
        这里就相当于是做22比较,如果相等,则进行下一组,如果不相等,则把这个数存到新数组中,用这个数再进行比较
      */
      this.sort();
      var arr1 = [this[0]];
      for(var i=1;i<this.length;i++){
        if(this[i] !== arr1[arr1.length-1]){
          arr1.push(this[i]);
        } 
      }
      return arr1;  
    }
    console.log(arr);
    console.log(arr.unique4());
Wah, mari kita sebut satu hari!

Keperluan juga mengatakan bahawa ia boleh dilaksanakan menggunakan gelung bersarang dua lapisan Sebaliknya ialah menggunakan 2 lapisan untuk gelung dan bandingkan setiap satu dengan tatasusunan asal

Array.prototype.unique5 = function(){
      //双层循环,一一比较
      for(var i=0;i<this.length;i++){ //从0开始
        for(j= i+1;j<this.length;j++){ //从1开始,逐个比较
          if(this[i] === this[j]){ //如果恒定
            this.splice(j,1);  //就将这个元素删掉
          } 
        } 
      }
      return this;  
    }
    console.log(arr);
    console.log(arr.unique5());
Kaedah penulisan ini memerlukan terlalu banyak gelung dan tidak digalakkan Sesetengah orang akan berkata, bukankah kaedah pertama dan ketiga juga perlu dilalui setiap kali? Ya, anda boleh memahaminya dengan cara ini, yang bermaksud anda memahaminya, tetapi ia bukan pemahaman yang istimewa Jika kita katakan ia hampir sama, ia adalah terlalu berbeza indexOf() bermakna apabila elemen padanan pertama ditemui. ia akan menjadi

Berhenti merentasi, dan Jenis 5 akan merentasi keseluruhan tatasusunan tanpa mengira sama ada ia boleh ditemui Jika jumlah data adalah besar, yang manakah anda rasa mempunyai prestasi yang lebih baik?

Nota khas: Apabila membandingkan dua nilai yang kongruen atau tidak sama, pastikan anda menggunakan pemalar (===) dan bukan pemalar (!==), kerana ini akan melibatkan elemen Dari segi jenis, untuk contoh, 1 dan '1' tidak sama!

Maklumat di atas adalah benar-benar kering, tidak ada kelembapan langsung, anda hanya boleh bergantung pada semua orang untuk memahaminya!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn