Metode traversal yang paling umum digunakan adalah untuk pernyataan (juga rekursif dan sementara). Ketika kita melintasi array, kita biasanya melakukan ini:
Salinan kode adalah sebagai berikut:
var arr = [1,2,3,4,5,6,7,8,9,10];
untuk (var i = 0, total = arr.length; i <total; i ++) {
console.log (i, arr [i]);
}
Ini adalah metode traversal yang paling umum digunakan: traversal urutan positif. Pergi dari item pertama dalam array ke item terakhir.
Lalu mengapa drama kecil masih menyebutkan traversal pesanan terbalik hari ini?
Di sini kita harus menyebutkan modul yang paling umum digunakan dalam komponen yang ditulis oleh Xiaoju: Acara. Digunakan untuk membuat model acara khusus, menangani acara mendengarkan dan memicu acara, mode publikasi dan berlangganan paling sederhana. Karena baru -baru ini menemukan bahwa ada bahaya tersembunyi dari meluap memori, perlu untuk menambahkan metode untuk melepaskan diri atas dasar aslinya.
Karena fungsi callback dengan nama acara yang sama ditempatkan dalam array yang sama, tidak mengikat hanya membutuhkan menemukan fungsi callback yang sesuai dari array (fungsi callback yang sama dapat diikat beberapa kali) dan menghapusnya.
Ini persyaratan yang sangat sederhana, jadi saya secara alami menulis kode yang mirip dengan yang berikut:
Salinan kode adalah sebagai berikut:
// Hapus 2 di array
var arr = [1,2,2,2,2,1,1,2,2];
untuk (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// memenuhi kondisinya, hapus
arr.splice (i, 1);
}
}
console.log (arr);
Tidak ada kode normal, tetapi output akhir adalah: [1, 2, 2, 1, 1, 2]. Jelas, hasil eksekusi tidak memenuhi harapan.
Apa masalahnya?
Setelah analisis yang cermat, saya menemukan bahwa masalahnya adalah bahwa setiap kali pertandingan berhasil, setelah melakukan operasi penghapusan, item berikutnya yang akan diperiksa akan dilewati karena setiap item dalam array akan naik satu per satu.
Saya menemukan masalah, mengubah kode, dan setelah melakukan operasi penghapusan, menyesuaikan indeks urutan (i).
Salinan kode adalah sebagai berikut:
// Hapus 2 di array
var arr = [1,2,2,2,2,1,1,2,2];
untuk (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// memenuhi kondisinya, hapus
arr.splice (i, 1);
// Sesuaikan indeks urutan
i = i-1;
}
}
console.log (arr);
Masalahnya telah diselesaikan, tetapi saya selalu merasa bahwa memodifikasi indeks urutan adalah trik untuk membuat loop. Jadi kilasan inspirasi, dan tamparan, dan kode berikut ini diserang:
Salinan kode adalah sebagai berikut:
// Hapus 2 di array
var arr = [1,2,2,2,2,1,1,2,2];
untuk (var i = arr.length-1; i! =-1; i-) {
if (arr [i] == 2) {
// memenuhi kondisinya, hapus
arr.splice (i, 1);
}
}
console.log (arr);
Proses traversal tetap tidak berubah. Satu -satunya hal yang berubah adalah bahwa urutan Traversal telah berubah. Ngomong -ngomong, ada juga satu total variabel yang hilang.
Oke, saya akui bahwa apa yang saya tulis hari ini sangat halus, tetapi melalui contoh ini, saya mengingatkan Anda saat menulis kode di masa depan. Selama proses traversal, jika melibatkan memodifikasi array itu sendiri (menambah dan menghapus), reverse traversal adalah metode traversal yang relatif aman.
Catatan pengkodean, biarkan mereka mengejek diri sendiri di masa depan!
Harap tunjukkan sumber untuk mencetak ulang: http://bh-lay.com/blog/148c07761fa