เรามีอาร์เรย์ของตัวเลขใน JavaScript ที่มีตัวเลขเรียงไม่เป็นลำดับ หน้าที่ของเราคือเขียนฟังก์ชันที่รับอาร์เรย์ตัวเลขนี้และคืนค่าอาร์เรย์สององค์ประกอบ คือ top 2 ของอาร์เรย์ (สองตัวที่มากที่สุด)
เราต้องทำในหนึ่งผ่าน (one pass) คือ ต้องทำใน linear time เช่นใช้ for loop เพียงลูปเดียว หรือถ้าใช้ ES6 function ต้องแน่ใจว่าใช้แค่ตัวเดียวครั้งเดียว และหลีกเลี่ยงการซ้อนเมธอดที่เพิ่ม time complexity
ตอนนี้มาเขียนโค้ดด้วยเมธอด Array.prototype.reduce():
ตัวอย่างโค้ด
const arr = [23, 65, 67, 23, 2, 6, 87, 23, 45, 65, 3, 234, 3];
const topTwo = arr => {
if (arr.length < 2) {
return false;
}
return arr.reduce((acc, val) => {
if (val > acc[0]) {
let t = acc[0];
acc[0] = val;
acc[1] = t;
} else if (val > acc[1]) {
acc[1] = val;
}
return acc;
}, [-Infinity, -Infinity]);
};
console.log(topTwo(arr));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็นดังนี้:
[234, 87]