طريقة اجتياز الأكثر شيوعًا هي للبيانات (أيضًا متكررة وأثناء). عندما نعبر صفيفًا ، عادة ما نفعل ذلك:
نسخة الكود كما يلي:
var arr = [1،2،3،4،5،6،7،8،9،10] ؛
لـ (var i = 0 ، total = arr.length ؛ i <total ؛ i ++) {
console.log (i ، arr [i]) ؛
}
هذه هي الطريقة الأكثر شيوعًا للعبور: اجتياز الترتيب الإيجابي. ينتقل من العنصر الأول في الصفيف إلى العنصر الأخير.
ثم لماذا لا تزال الدراما الصغيرة تذكر الترتيب العكسي اليوم؟
يجب أن نذكر هنا الوحدة النمطية الأكثر استخدامًا في المكون الذي كتبه Xiaoju: الأحداث. تستخدم لإنشاء نماذج الأحداث المخصصة ، والتعامل مع الاستماع إلى الحدث والتشغيل ، وأبسط وضع النشر والاشتراك. نظرًا لاكتشاف مؤخرًا أن هناك خطرًا خفيًا من تدفق الذاكرة ، فمن الضروري إضافة طريقة لإلغاء التعبير على الأساس الأصلي.
نظرًا لأن وظيفة رد الاتصال مع نفس اسم الحدث يتم وضعها في نفس الصفيف ، يتطلب الإلغاء فقط العثور على وظيفة رد الاتصال المقابلة من الصفيف (قد تكون وظيفة رد الاتصال نفسها ملزمة عدة مرات) وإزالتها.
إنه مطلب بسيط للغاية ، لذلك كتبت بشكل طبيعي رمزًا مشابهًا لما يلي:
نسخة الكود كما يلي:
// إزالة 2 في الصفيف
var arr = [1،2،2،2،2،1،2،2،2] ؛
لـ (var i = 0 ، total = arr.length ؛ i <total ؛ i ++) {
if (arr [i] == 2) {
// تلبية الشروط ، وإزالة
arr.splice (i ، 1) ؛
}
}
console.log (arr) ؛
لا يوجد رمز عادي ، ولكن الإخراج النهائي هو: [1 ، 2 ، 2 ، 1 ، 1 ، 2]. من الواضح أن نتيجة التنفيذ لا تفي بالتوقعات.
ما هي المشكلة؟
بعد تحليل دقيق ، وجدت أن المشكلة هي أنه في كل مرة تنجح فيها المباراة ، بعد إجراء عملية الإزالة ، سيتم تخطي العنصر التالي الذي سيتم فحصه لأن كل عنصر في الصفيف سيرتفع واحدًا تلو الآخر.
لقد وجدت المشكلة ، غيرت الرمز ، وبعد إجراء عملية الإزالة ، قم بضبط فهرس التسلسل (I).
نسخة الكود كما يلي:
// إزالة 2 في الصفيف
var arr = [1،2،2،2،2،1،2،2،2] ؛
لـ (var i = 0 ، total = arr.length ؛ i <total ؛ i ++) {
if (arr [i] == 2) {
// تلبية الشروط ، وإزالة
arr.splice (i ، 1) ؛
// اضبط فهرس التسلسل
أنا = I-1 ؛
}
}
console.log (arr) ؛
تم حل المشكلة ، لكنني أشعر دائمًا أن تعديل مؤشر التسلسل هو خدعة لصنع حلقة. لذا فلاش الإلهام ، وصفة ، وتم ضرب الرمز التالي:
نسخة الكود كما يلي:
// إزالة 2 في الصفيف
var arr = [1،2،2،2،2،1،2،2،2] ؛
لـ (var i = arr.length-1 ؛ i! =-1 ؛ i-) {
if (arr [i] == 2) {
// تلبية الشروط ، وإزالة
arr.splice (i ، 1) ؛
}
}
console.log (arr) ؛
لا تزال عملية اجتياز دون تغيير. الشيء الوحيد الذي يتغير هو أن ترتيب اجتياز قد تغير. بالمناسبة ، هناك أيضًا متغير واحد مفقود.
حسنًا ، أعترف أن ما كتبته اليوم حريري للغاية ، لكن من خلال هذا المثال ، أذكرك عند كتابة التعليمات البرمجية في المستقبل. أثناء عملية اجتياز ، إذا كانت تنطوي على تعديل الصفيف نفسه (إضافة وحذف) ، فإن اجتياز العكسي هو طريقة اجتياز آمنة نسبيًا.
ملاحظات الترميز ، اتركهم لسخرية نفسك في المستقبل!
يرجى الإشارة إلى مصدر إعادة الطباعة: http://bh-lay.com/blog/148c07761fa