พิจารณาอาร์เรย์ไบนารีต่อไปนี้ (Array 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 แตสำหรับ 0 ใน arr จะเป็น 0 ในเอาต์พุทเช่นกัน
มาเขียนโค้ดสำหรับฟังก์ชันนี้โดยใช้เมธอด Array.prototype.reduceRight() ซึ่งทำงานเหมือน reduce ปกติ แค่เริ่มจากขวาแทนซ้าย:
ตัวอย่างโค้ด
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 ]