พิจารณาอาร์เรย์ไบนารีต่อไปนี้ (อาร์เรย์ A) -
const arr = [1,0,1,1,1,1,0,1,1];
เมื่ออาร์เรย์นี้ถูกส่งผ่านฟังก์ชัน ให้พูด sumRight() อาร์เรย์นี้จะสร้างเอาต์พุตอาร์เรย์ (Array B) ดังต่อไปนี้ -
const output = [1,0,4,3,2,1,0,2,1];
ทำความเข้าใจฟังก์ชัน
องค์ประกอบในอาร์เรย์ arr สามารถเป็นได้ทั้ง 0 หรือ 1 ฟังก์ชันนับถอยหลังจากองค์ประกอบสุดท้ายของอาร์เรย์ arr หากมี 1 ตัวติดต่อกันในอาร์เรย์ arr องค์ประกอบที่สอดคล้องกันในอาร์เรย์เอาต์พุตจะเป็น 1 แต่สำหรับ 1 ตัวที่ต่อเนื่องกันในอาร์เรย์ arr มันจะเป็น 2 สำหรับอาร์เรย์อินพุตที่ 3 องค์ประกอบในอาร์เรย์เอาต์พุตจะเป็น 3 แต่สำหรับ 0 ในอาร์เรย์ arr มันจะเป็น 0 ในอาร์เรย์เอาต์พุตเช่นกัน
เรามาเขียนโค้ดสำหรับฟังก์ชันนี้โดยใช้เมธอด Array.prototype.reduceRight() ซึ่งทำงานเหมือนกับวิธีการลดแบบปกติ โดยเริ่มจากด้านขวาแทนที่จะเป็นด้านซ้าย −
ตัวอย่าง
const arr = [1,0,1,1,1,1,0,1,1]; const sumRight = arr => { return arr.reduceRight((acc, val) => { const { prev, res } = acc; if(val === 0){ return { prev: 0, res: res.concat(0) }; }; return { res: res.concat(val+prev), prev: prev+1 }; }, { prev: 0, res: [] }).res.reverse(); }; console.log(sumRight(arr));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น -
[ 1, 0, 4, 3, 2, 1, 0, 2, 1 ]