การปรับลดรอบซ้ำที่ไม่จำเป็นในลูปของ JavaScript
ในโค้ดต่อไปนี้ มีโปรแกรมเมอร์คนหนึ่งกำลังตรวจสอบว่า
ในอาร์เรย์มีตัวเลข 3 อยู่หรือไม่:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let exists = false;
for (let elem of arr) {
if (elem === 3) {
exists = true;
}
}
console.log(exists);
มีอะไรผิดปกติกับวิธีแก้ปัญหาของเขาเหรอ? ดูเหมือนจะไม่มี
การดำเนินการที่ไม่จำเป็นในลูปเลย ปัญหานั้น
อยู่ที่ว่า หลังจากที่ตรวจสอบได้แล้ว
ว่ามีตัวเลข 3 อยู่ในอาร์เรย์ ลูป
ก็ยังคงทำงานต่อไปจนถึงจุดสิ้นสุดของอาร์เรย์
สิ่งที่ไม่มีประสิทธิภาพมากที่สุดคือ ถ้าตัวเลข 3
ถูกพบที่ไหนสักแห่งในตอนต้นของอาร์เรย์ และตัวอาร์เรย์เอง
มีความยาว สมมติว่า 1000 องค์ประกอบ
จะได้รอบซ้ำของลูปที่ไร้ประโยชน์ถึงหนึ่งพันรอบ!
ไม่เหมาะที่สุด
เรามาปรับโค้ดให้เหมาะสมโดยการหยุดลูป ในเวลาที่เหมาะสม:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let exists = false;
for (let elem of arr) {
if (elem === 3) {
exists = true;
break;
}
}
console.log(exists);
โค้ดต่อไปนี้คำนวณว่าต้องบวกองค์ประกอบของอาร์เรย์
กี่ตัวถึงจะได้ผลรวมมากกว่า 10
ให้ทำการปรับลด:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let sum = 0;
let i = 1;
for (let elem of arr) {
sum += elem;
if (sum <= 10) {
i++;
}
}
console.log(i);
โค้ดต่อไปนี้แสดงเลขคู่ จากขอบเขตที่กำหนด ให้ทำการปรับลด:
for (let i = 0; i <= 100; i++) {
if (i % 2 === 0) {
console.log(i);
}
}
โค้ดต่อไปนี้แสดงตัวเลข
ที่หารด้วย 2
และ 3 ลงตัวพร้อมกัน ให้ทำการปรับลด:
for (let i = 0; i <= 100; i++) {
if (i % 2 === 0 && i % 3 === 0) {
console.log(i);
}
}
โค้ดต่อไปนี้ค้นหาวันศุกร์ที่ 13
ทั้งหมดในปีปัจจุบัน
ให้ทำการปรับลด:
for (let i = 0; i <= 11; i++) {
let curr = new Date;
let last = new Date(curr.getFullYear(), i + 1, 0).getDate();
for (let j = 1; j <= last; j++) {
let date = new Date(curr.getFullYear(), i, j);
if (date.getDate() === 13 && date.getDay() === 5) {
console.log(date);
}
}
}