วิธีการเดินทางที่ใช้กันมากที่สุดสำหรับคำสั่ง (รวมถึงการเรียกซ้ำและในขณะที่) เมื่อเราสำรวจอาร์เรย์เรามักจะทำสิ่งนี้:
การคัดลอกรหัสมีดังนี้:
var arr = [1,2,3,4,5,6,7,7,8,9,10];
สำหรับ (var i = 0, total = arr.length; i <total; i ++) {
console.log (i, arr [i]);
-
นี่เป็นวิธีการสำรวจที่ใช้กันมากที่สุด: การเดินทางตามลำดับเชิงบวก มันไปจากรายการแรกในอาร์เรย์ไปยังรายการสุดท้าย
แล้วทำไมละครเล็ก ๆ ถึงยังคงพูดถึงการข้ามคำสั่งย้อนกลับในวันนี้?
ที่นี่เราต้องพูดถึงโมดูลที่ใช้กันมากที่สุดในส่วนประกอบที่เขียนโดย Xiaoju: Events ใช้เพื่อสร้างโมเดลเหตุการณ์ที่กำหนดเองจัดการการฟังและทริกเกอร์ซึ่งเป็นโหมดการเผยแพร่และสมัครสมาชิกที่ง่ายที่สุด เนื่องจากเมื่อเร็ว ๆ นี้ค้นพบว่ามีอันตรายที่ซ่อนอยู่ของหน่วยความจำล้นจึงจำเป็นต้องเพิ่มวิธีการที่จะยกเลิกการยกเลิกบนพื้นฐานดั้งเดิม
เนื่องจากฟังก์ชั่นการโทรกลับที่มีชื่อเหตุการณ์เดียวกันถูกวางไว้ในอาร์เรย์เดียวกันการปลดสายต้องใช้เฉพาะการค้นหาฟังก์ชั่นการโทรกลับที่สอดคล้องกันจากอาร์เรย์ (ฟังก์ชั่นการโทรกลับเดียวกันอาจถูกผูกไว้หลายครั้ง) และลบออก
มันเป็นข้อกำหนดที่ง่ายมากดังนั้นฉันจึงเขียนโค้ดโดยธรรมชาติคล้ายกับต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
// ลบ 2 ในอาร์เรย์
var arr = [1,2,2,2,2,1,1,1,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,1,1,2,2];
สำหรับ (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// ตรงตามเงื่อนไขลบ
arr.splice (i, 1);
// ปรับดัชนีลำดับ
i = i-1;
-
-
console.log (arr);
ปัญหาได้รับการแก้ไขแล้ว แต่ฉันมักจะรู้สึกว่าการปรับเปลี่ยนดัชนีลำดับเป็นเคล็ดลับในการทำลูป ดังนั้นแรงบันดาลใจและการตบและรหัสต่อไปนี้ถูกตีออก:
การคัดลอกรหัสมีดังนี้:
// ลบ 2 ในอาร์เรย์
var arr = [1,2,2,2,2,1,1,1,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