Saat melakukan operasi array, Anda sering menghadapi masalah menghilangkan duplikat. Berikut ini adalah pengantar singkat tentang metode deduplikasi array.
Indeks Deduplikasi
Array.prototype.Unique1 = function () {var arr = []; untuk (var i = 0; i <this.length; i ++) {var item = this [i]; if (arr.indexof (item) === -1) {arr.push (item);}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .Unique1 (); // [1, 2, 3, "4", 4, "34"]Namun, di bawah IE6-8, metode indeks dari array belum ada (meskipun ini adalah topik yang agak lama O (∩_∩) o ~), tetapi pemrogram harus menulis metode indeks dari:
var indexof = [] .indexof? function (arr, item) {return arr.indexof (item);}: function indexOf (arr, item) {for (var i = 0; i <arr.length; i ++) {if (arr [i] === item) {return i;}} return -1;} array.prototype.Unique2 = function () {) {var = = 0; for = aRray. {var item = this [i]; if (arr.indexof (item) === -1) {arr.push (item);}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique2 (); // [1, 2, 3, "4", 4, "34"]IndexOf juga dapat menggunakan cara rekayasa ulang ini:
Array.prototype.unique3 = function () {var arr = [ini [0]]; untuk (var i = 1; i <this.length; i ++) {if (this.indexof (this [i]) == i) {arr.push (this [i]);}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .Unique3 (); // [1, 2, 3, "4", 4, "34"]Hash untuk memuat ulang
Indeksof di atas benar, tetapi dalam hal kinerja, siklus ganda akan mengurangi kinerja. Lalu kami menggunakan hash.
Array.prototype.Unique4 = function () {var arr = []; var hash = {}; for (var i = 0; i <this.length; i ++) {var item = this [i]; var key = typeof (item)+hash [hash]! == 1) {arr.push (item); hash)+hash [hash [key]! == 1) {arr.push (item); hash)+hash [hash [key] == 1) {arr.push (item); hash) [hash [hash [key] == 1) {arr.push (item); hash) [hash [hash [key] == 1) {arr.push (item); hasH) [hash [hash [KEY] == 1) {arr.push (item); hash) arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .Unique4 (); // [1, 2, 3, "4", 4, "34"]Inti adalah membangun objek hash untuk menggantikan IndexOF. Ubah ruang ke waktu. Perhatikan bahwa dalam JavaScript, nilai kunci suatu objek hanya dapat berupa string (tentu saja, ES6 menyediakan struktur data peta. Ini mirip dengan suatu objek dan juga merupakan kumpulan pasangan nilai kunci, tetapi ruang lingkup "kunci" tidak terbatas pada string. Semua jenis nilai (termasuk objek) dapat dianggap sebagai kunci. Dengan kata lain, struktur objek ". yang merupakan representasi struktur hash yang lebih lengkap.), Jadi var key = typeof (item) + item diperlukan untuk membedakan antara nilai 1 dan string '1'.
Maka jika Anda ingin '4' dan 4 dianggap sama (pendekatan lain sama)
Array.prototype.Unique5 = function () {var arr = []; var hash = {}; for (var i = 0, len = this.length; i <len; i ++) {if (! Hash [i]]) {arr.push (ini [i]); hash [i] [i] = true; arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .Unique5 (); // [1, 2, 3, "4", "34"]Setelah menyortir, de-repeat
Array.prototype.unique6 = function () {this.sort (); var arr = [this [0]]; for (var i = 1; i <this.length; i ++) {if (ini [i]! == arr [arr.length-1]) {arr.push (ini [i]);}}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .Unique6 (); // [1, 2, 3, "34", "4", 4]Pertama -tama urutkan array, lalu bandingkan dua nilai yang berdekatan. Saat menyortir, gunakan metode sortir asli JS, jadi sangat cepat. Hanya ada satu kelemahan dari metode ini. Saat membandingkan karakter, mereka diurutkan dalam urutan pengkodean karakter. Jadi Anda akan melihat bahwa 10 berada di peringkat pertama dalam 2. Namun, itu tidak akan mempengaruhi penghapusan beban berat. Namun, untuk memecahkan masalah jenis, metode pengurut menerima parameter, yang merupakan metode:
function compare (value1, value2) {if (value1 <value2) {return -1;} else if (value1> value2) {return 1;} else {return 0;}} [1,2,5,2,10,3,20] .sort (bandingkan); // [1, 2, 2, 3, 5, 10, 20]Diatur untuk memuat ulang
ES6 menyediakan set struktur data baru. Ini mirip dengan array, tetapi nilai -nilai anggota semuanya unik, tanpa nilai duplikat. Browser sekarang sepenuhnya didukung, dan simpul server juga didukung.
Array.prototype.Unique7 = function () {return array.from (set baru (ini));} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique7 (); // [1, 2, 3, "4", 4, "34"]Metode Perpustakaan
Direkomendasikan Metode Perpustakaan Underscore.js, yang sangat populer di Node atau Browser JS.
const _ = membutuhkan ('underscore'); _. uniq ([1, 2, 1, 3, 1, 4]); // [1, 2, 3, 4]Waktu tes
Semua metode di atas dapat diuji dengan cara yang sederhana, dan kemudian membandingkan dan memilih metode terbaik:
console.time ("tes"); [1,2,3, '4', 3,4,3,1, '34 ', 2] .Unique7 (); Console.Timeend ("Test"); ==> VM314: 3 Tes: 0,378msUntuk membuat data lebih besar, buat 1 juta angka secara acak:
var arr = []; var num = 0; untuk (var i = 0; i <1000000; i ++) {num = math.floor (math.random ()*100); arr.push (num);} konsol.time ("test"); arr.Unique (); konsol.timeEnd ("test");Di atas adalah deduplikasi array JavaScript yang diperkenalkan oleh editor kepada Anda dari lambat ke cepat dari sedang hingga sederhana. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!