สมมติว่าเรามีอาร์เรย์ของสตริง/ตัวเลขที่มีค่าซ้ำบ้างอย่างนี้:
const array = ['day', 'night', 'afternoon', 'night', 'noon', 'night', 'noon', 'day', 'afternoon', 'day', 'night'];
เราต้องเขียนฟังก์ชัน groupSimilar() ที่รับอาร์เรย์นี้และคืนค่าอาร์เรย์ใหม่ที่รายการซ้ำทั้งหมดถูกจัดกลุ่มร่วมกันในซับอาร์เรย์เป็นองค์ประกอบตัวแรก และจำนวนรวมในอาร์เรย์ต้นฉบับเป็นองค์ประกอบตัวที่สอง
ดังนั้น สำหรับตัวอย่างนี้ ผลลัพธ์ควรเป็น:
[ ['day', 3], ['night', 4], ['afternoon', 2], ['noon', 2] ]
มาเขียนโค้ดสำหรับฟังก์ชันนี้ เราจะใช้ Array.prototype.map() เพื่อสร้างอาร์เรย์ใหม่ที่ต้องการ และใช้ Map เพื่อติดตามรายการซ้ำในอาร์เรย์:
ตัวอย่างโค้ด
const array = ['day', 'night', 'afternoon', 'night', 'noon', 'night', 'noon', 'day', 'afternoon', 'day', 'night'];
const groupSimilar = arr => {
return arr.reduce((acc, val) => {
const { data, map } = acc;
const ind = map.get(val);
if (map.has(val)) {
data[ind][1]++;
} else {
map.set(val, data.push([val, 1]) - 1);
}
return { data, map };
}, {
data: [],
map: new Map()
}).data;
};
console.log(groupSimilar(array));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็นดังนี้:
[ ['day', 3], ['night', 4], ['afternoon', 2], ['noon', 2] ]