Rumah > Artikel > hujung hadapan web > Penjelasan terperinci tentang kemahiran deduplikasi tatasusunan javascript problem_javascript
Pertama sekali, apa yang saya fikirkan ialah mencipta tatasusunan hasil lain untuk menyimpan data unik dalam tatasusunan asal. Lintas tatasusunan asal dan bandingkan dengan elemen dalam tatasusunan hasil untuk mengesan pendua. Jadi, saya menulis kod A berikut:
Array.prototype.clearRepetitionA = function(){ var result = []; var isRepetition; for(var i=0; i<this.length; i++){ isRepetition = false; for(var j=0; j<result.length; j++){ if(this[i] === result[j]){ isRepetition = true; break; } } if(!isRepetition){ result.push(this[i]); } } return result; }
Selepas selesai menulis, saya tiba-tiba teringat bahawa kaedah tatasusunan indexOf dalam ECMAScript 5 yang baru saya baca beberapa hari lalu boleh mendapatkan semula elemen tatasusunan. Jadi saya menggunakan kaedah indexOf untuk menggantikan gelung tahap kedua dan menulis yang berikut Kod B:
Array.prototype.clearRepetitionB = function(){ var result = []; for(var i=0; i<this.length; i++){ if(result.indexOf(this[i]) == -1){ result.push(this[i]); } } return result; }
Kod tiba-tiba berubah daripada 17 baris kepada 9 baris, yang jauh lebih mudah. Biasanya terdapat lebih daripada satu cara untuk menyelesaikan soalan besar dalam matematik sekolah menengah, dan kemudian saya terus memikirkan kaedah lain. Kaedah indexOf bermaksud mencari elemen dengan nilai yang diberikan dalam keseluruhan tatasusunan, dan mengembalikan indeks elemen pertama yang ditemui, ia mengembalikan -1 Parameter pertama ialah nilai yang akan dicari, dan parameter kedua adalah pilihan: Ia menentukan indeks dalam tatasusunan untuk memulakan carian Jika parameter ini ditinggalkan, carian bermula dari awal. Sebaik sahaja saya mula berfikir, saya fikir kaedah sebelumnya adalah untuk mengesan sama ada nilai itu diulang Sekarang kita mempunyai kaedah indexOf, kita boleh menilai berdasarkan indeks kejadian pertama setiap elemen yang dikesan dan nilai indeks. unsur itu sendiri. Jadi, saya menulis Kod C:
Array.prototype.clearRepetitionC = function(){ var result = [this[0]]; for(var i=1; i<this.length; i++){ if(this.indexOf(this[i]) == i){ result.push(this[i]); } } return result; }
Selepas menulis ini, saya terus memikirkannya, tetapi saya benar-benar tidak dapat memikirkan kaedah lain ketiga-tiga kaedah ini semuanya sangat asas. Jadi, saya pergi untuk membandingkan jawapan dan menguji diri saya sendiri. Apabila saya melihat jawapan, saya mendapati bahawa saya masih terlalu lemah, dan soalan mudah masih mempunyai beberapa idea yang hebat. Perkara berikut bukanlah yang saya fikirkan, jadi saya tidak akan bercakap terlalu banyak tentang perjalanan mental saya. Tanpa berlengah lagi, mari terus ke analisis jawapan klasik.
Mula-mula, mari kita bercakap tentang penyelesaian yang sering dikatakan dalam algoritma untuk menukar ruang untuk masa dan mengekalkan pembentukannya. Mari kita panggilnya Kod D:
Array.prototype.clearRepetitionD = function(){ var result = []; var obj = {}; var key,type; for(var i=0; i<this.length; i++){ key = this[i]; type = typeof key; if(!obj[key]){ obj[key] = [type]; result.push(key); }else if(obj[key].indexOf(type)){ obj[key].push(type); result.push(key); } } return result; }
Dalam kaedah ini, atribut objek obj digunakan untuk menyimpan nilai elemen dalam tatasusunan asal apabila melintasi tatasusunan asal. Pada masa yang sama, nilai atribut ini ialah tatasusunan, digunakan untuk menyimpan jenis atribut ini. Ini boleh membezakan elemen yang serupa dengan nombor 1 dan elemen rentetan '1' dalam tatasusunan asal. Kaedah ini mengurangkan masa yang digunakan oleh kaedah indexOf antara tiga kaedah di atas dengan membina objek tambahan, yang boleh dikatakan lebih cekap.
Jika anda berpuas hati dengan kaedah cekap yang disebutkan di atas untuk menukar ruang untuk masa dan tidak meneruskan membaca, maka anda salah sama sekali. Kini keseronokan bermula, tidak syak lagi bahawa ia adalah Kod E:
Array.prototype.clearRepetitionE = function(){ var result = []; for(var i=0; i<this.length; i++){ for(var j=i+1; j<this.length; j++){ if(this[i] === this[j]){ j = ++i; } } result.push(this[i]); } return result; }
Kod D menukar ruang untuk masa, dan perasaan itu sederhana sahaja. Bagaimana dengan kod E? Adakah kod ini salah? Bolehkah ini mengalih keluar pendua? Ya, saya tidak memahami kod itu pada mulanya saya tidak memahaminya sehingga saya membaca analisis dan membacanya semula. Kemudian, pembaca yang tidak faham harus membaca analisis dengan teliti: tahap pertama merentasi tatasusunan asal dari hadapan ke belakang, dan gelung tahap kedua mengesan sama ada setiap elemen diulang dengan elemen selepasnya , Langkau ia jika semua elemen selepas elemen ini adalah unik, tambahkannya pada tatasusunan yang terhasil. Idea untuk melaksanakan kaedah ini adalah untuk mendapatkan nilai paling tepat tanpa pendua dan menambahnya pada tatasusunan hasil Berbanding dengan kaedah pertama, ini juga mengoptimumkan gelung peringkat kedua dan lebih cekap daripada itu tatasusunan kaedah ini Susunan unsur adalah berbeza daripada susunan unsur dalam tatasusunan asal.
Selepas membaca analisis Kod E, adakah anda sudah memberikan ibu jari anda dan memandang saya dengan kagum? (Jangan berikan bunga dan penghormatan ini kepada saya, mereka harus pergi kepada tuan yang menulis kaedah ini). Mari kita bincangkan tentang kaedah terakhir: Iaitu mengisih dahulu dan kemudian mengalih keluar pendua. Mengikut peraturan lama, ia dipanggil Kod F:
Array.prototype.clearRepetitionF = function(){ this.sort(); var result = [this[0]]; for(var i=1; i<this.length; i++){ if(this[i] !== result[result.length-1]){ result.push(this[i]); } } return result; }
Ini pertama kali menggunakan isihan kaedah isihan tatasusunan untuk mengisih unsur tatasusunan, dan kemudian melaksanakan kerja pendua.
Di atas adalah kajian langkah demi langkah tentang masalah deduplikasi tatasusunan javascript Kod ini sentiasa diperbaiki Sebanyak enam keping kod saya harap semua orang akan belajar bersungguh-sungguh dan memperoleh sesuatu.