Kata Pengantar
Baru-baru ini, untuk menukar kerja dan bersedia untuk temu duga, saya mula menyemak dan menyemak pengetahuan berkaitan JavaScript Petang semalam, saya memikirkan kaedah berkaitan deduplikasi tatasusunan, jadi saya hanya menyusun beberapa artikel algoritma JavaScript untuk. Penggunaan masa hadapan. Siri artikel ini tidak pasti Nombor, masa yang tidak pasti, saya akan menulis di mana sahaja saya fikir, tiada jaminan ketepatan, tiada jaminan kecekapan tinggi, hanya bercakap tentang pemahaman peribadi, jika ada kesilapan, sila betulkan.
Mengenai penyingkiran pendua
Penyahduplikasi tatasusunan ialah titik pemeriksaan algoritma biasa, dan cara untuk mencapai penyahduplikasian tidak lebih daripada melalui keunikan dan bukan keunikan. Ringkasnya, ini bermaksud memilih yang unik atau memadamkan yang bukan unik. Semua algoritma berikut dinamakan secara membuta tuli oleh saya, sila abaikan mereka.
Padanan gelung untuk mengalih keluar pendua
Seperti namanya, setiap elemen dalam tatasusunan dibandingkan dengan tatasusunan yang menyimpan elemen Apabila menghadapi elemen tidak berulang, ia dimasukkan ke dalam tatasusunan baharu sehingga penghujung gelung juga boleh dipanggil pemadanan gelung berganda. Mengalih keluar pendua ialah cara paling mudah yang boleh difikirkan oleh semua orang.
Kod pelaksanaan:
var arr=[1,3,4,56,3,7,9,7]; var result=[]; //匹配 function isMatch(array,n){ for(var i=0;i<array.length;i++){ if(array[i]==n){ return true; } } return false; }; //验证所有元素 function unqiue(array){ for(var i=0;i<array.length;i++){ if(!isMatch(result,array[i])){ result.push(array[i]); } } return result; }; console.log(unqiue(arr));
Nota: Terdapat pepijat dalam kaedah di atas Apabila terdapat nombor dan rentetan berangka, nombor dan rentetan berangka tidak dibezakan. Oleh kerana kesamaan berganda "==" digunakan dalam fungsi padanan isMatch() dan jenis elemen tidak disahkan, kongruen "===" sebenarnya harus digunakan.
Kod yang diubah suai adalah seperti berikut:
var arr=[1,3,4,56,3,'1',7,9,7]; var result=[]; //匹配 function isMatch(array,n){ for(var i=0;i<array.length;i++){ if(array[i]===n){ return true; } } return false; }; //验证所有元素 function unqiue(array){ for(var i=0;i<array.length;i++){ if(!isMatch(result,array[i])){ result.push(array[i]); } } return result; }; console.log(unqiue(arr));
Kebaikan dan keburukan algoritma:
Kelebihan:
Pelaksanaan mudah dan pemikiran intuitif
Kelemahan:
Ketidakcekapan
deduplikasi JSON/deduplikasi objek/deduplikasi kamus
Deduplikasi JSON, secara ringkasnya, ialah menggunakan keunikan kekunci objek Objek untuk menukar elemen tatasusunan kepada JSON atau nilai kunci objek. Nilai JSON menyimpan indeks indeks tatasusunan, dan kemudian melakukan for dalam gelung pada objek JSON dan menyimpannya dalam tatasusunan baharu.
Array, JSON dan {} adalah semua Objek, jadi algoritma ini boleh dilaksanakan menggunakan mana-mana satu.
Kod pelaksanaan:
Mod tatasusunan:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache=[]; var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
Mod JSON:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache={}; var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
Mod objek:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache=new Object(); var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
Kebaikan dan keburukan algoritma:
Kelebihan:
Mudah
Sangat cekap
Kelemahan:
1 Menukar jenis elemen tatasusunan ()
2. Terdapat pepijat (tidak lebih daripada membezakan antara nombor dan rentetan angka)
Deduplikasi rekursif baris gilir
Saya memikirkannya untuk masa yang lama malam tadi dan terfikir untuk menggunakan baris gilir Mula-mula menyusun tatasusunan ke dalam baris gilir dalam tertib menaik atau menurun, supaya elemen yang sama berada di rantau, dan kemudian padan dari penghujung. baris gilir ke hadapan Jika perlawanan berjaya, padamkan penghujung baris gilir , dan kemudian elemen sebelumnya sepadan dengan elemen sebelumnya. Selepas keseluruhan pemadanan selesai, elemen yang selebihnya ialah baris gilir pendua.
var arr=[6, 4, 6, 9, '6', 13, 56, 9, ,'11',1, 8, '7', 17, 5, 45, 3, 7]; function unqiue(array){ //排序数组,形成队列 array.sort(function(m,n){return m-n;}); ////排序后,队尾向前对比,如果相同,删除队尾,依次类推 function loop(Index){ if(Index>=1){ if(array[Index]===array[Index-1]){ arr.splice(Index,1); } loop(Index-1); } } loop(array.length-1); return array; } console.log(unqiue(arr));
Kebaikan dan keburukan algoritma:
Kelebihan:
Kecekapan yang lebih tinggi
Kelemahan:
Bukan yang paling cekap
Kaedah penyahduplikasi INDEXOF
Tentukan sama ada penyemak imbas menyokong indexOf ialah kaedah baharu ecmaScript5 Ia tidak disokong oleh IE8 dan ke bawah (termasuk IE8, IE8 hanya menyokong sebahagian daripada ecma5)
if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = -1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } }