พิจารณาอาร์เรย์ไบนารีต่อไปนี้ (อาร์เรย์ 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 ]