Terkadang persyaratan semacam ini ditemui, dan Anda perlu menghapus elemen duplikat di array dan hanya menyimpan satu. Metode pertama yang terlintas dalam pikiran mungkin untuk menggunakan 2 untuk loop untuk membandingkan dan menghapus elemen duplikat. Kodenya adalah sebagai berikut:
Metode 1:
Salinan kode adalah sebagai berikut:
Array.prototype.distinct = function () {
var arr = [],
len = this.length;
untuk (var i = 0; i <len; i ++) {
untuk (var j = i+1; j <len; j ++) {
if (this [i] === Ini [j]) {
j = ++ i;
}
}
arr.push (ini [i]);
}
return arr;
};
Metode Penggunaan 1 Jika Anda menemukan lebih banyak data, kinerja Anda akan jauh lebih buruk. Kemudian silakan terus melihat metode berikut.
Metode 2:
Salinan kode adalah sebagai berikut:
Array.prototype.distinct = function () {
var self = ini,
arr = self.concat (). sort (); // Buat array baru dan urutkan
arr.sort (function (a, b) {
if (a === b) {
var n = self.indexof (a); // Dapatkan nilai indeks
self.splice (n, 1);
}
});
mengembalikan diri;
};
Metode 2 menggunakan fungsi callback kustom, dan juga menggunakan IndexOf, metode yang tidak didukung oleh IE6/7/8. Tentu saja, IndexOf dapat disimulasikan dengan sendirinya, tetapi masalah yang lebih besar adalah bahwa ada juga perbedaan antara metode sortir IE6/7/8 dan browser standar. Ada banyak jebakan dalam fungsi panggilan balik khusus yang menggunakan metode pengurutan di IE6/7/8. Kode fungsi panggilan balik sortir kustom di atas akan secara langsung melaporkan kesalahan "Nomor yang hilang" di IE6/7/8. Jika fungsi callback mengembalikan NAN, kesalahan ini akan dilaporkan, karena secara teori, fungsi sortir callback hanya dapat mengembalikan bilangan bulat. Bahkan jika nilai pengembalian diabaikan, masih ada masalah lain, dan pada akhirnya, tidak ada terlalu banyak masalah. Metode 2 tidak akan berfungsi di IE6/7/8.
Dari dermaga bodoh, inilah kodenya:
Salinan kode adalah sebagai berikut:
Array.prototype.delrepeat = function () {
var newArray = [];
var provisionaltable = {};
untuk (var i = 0, item; (item = this [i])! = null; i ++) {
if (! ProvisionSable [item]) {
newarray.push (item);
ProvisionSable [item] = true;
}
}
mengembalikan newarray;
};
Metode 3 menggunakan objek sementara untuk menyimpan elemen array. Jika Anda menemukan elemen array duplikat, itu akan diabaikan. Namun, jika Anda menemukan array berikut:
Salinan kode adalah sebagai berikut:
var arr = ['firefox', 1, '1'];
Jika array di atas digunakan dalam Metode 3, itu akan secara keliru menghapus 1 dan "1" sebagai elemen duplikat, sehingga sedikit modifikasi metode 3 dapat diselesaikan.
Versi Metode 3 yang dimodifikasi:
Salinan kode adalah sebagai berikut:
Array.prototype.distinct = function () {
var arr = [],
obj = {},
i = 0,
len = this.length,
hasil;
untuk (; i <len; i ++) {
Hasil = ini [i];
if (obj [hasil]! == hasil) {
arr.push (hasil);
obj [hasil] = hasil;
}
}
return arr;
};
Kemudian saya membaca komentar di akhir artikel tentang Fools Wharf. Metode ini sama dengan metode yang disediakan oleh Rekey, tetapi metode ini juga memiliki bug. Jika Anda menemukan array 2B seperti itu, Anda akan baik -baik saja:
Salinan kode adalah sebagai berikut:
var arr = ['firefox', 1, '1', 1];
Array di atas dimodifikasi dengan metode 3, dan 3 elemen terakhir tidak akan dihapus. Namun, array semacam ini agak ekstrem. Jika Anda menemukan data dengan ukuran literal yang sama dan jumlah string, Anda harus diproses terlebih dahulu untuk menghindari bug ini. Metode menggunakan objek sementara sedikit lebih cepat daripada mengurutkan di browser standar, dan algoritma metode pengurutan juga harus berbeda di setiap browser.