ใช้ reduce() ร่วมกับ Map นับความถี่ของ property
สร้าง Map นับ frequency ของ subjectName ในอาร์เรย์ออบเจกต์
ตัวอย่างโค้ด
const subjectDetails = [
{ subjectId: '101', subjectName: 'JavaScript' },
{ subjectId: '102', subjectName: 'Java' },
{ subjectId: '103', subjectName: 'JavaScript' }
];
const result = [...subjectDetails.reduce((map, obj) => {
if (map.has(obj.subjectName)) {
map.get(obj.subjectName).frequency++;
} else {
map.set(obj.subjectName, { subjectName: obj.subjectName, frequency: 1 });
}
return map;
}, new Map()).values()];
console.log(result);
วิธีรัน
node fileName.js
ผลลัพธ์
[
{ subjectName: 'JavaScript', frequency: 2 },
{ subjectName: 'Java', frequency: 1 }
]
คำอธิบาย
reduce()สะสมค่าใน Map (key = subjectName, value = {subjectName, frequency})Mapใช้เพื่อ key เป็น string/object ได้ และรักษาลำดับ insertion.values()ดึงค่า (value) ของ Map ทั้งหมด[...values()]แปลง iterator เป็นอาร์เรย์
วิธีง่ายกว่า: ใช้ Object แทน Map
const count = subjectDetails.reduce((acc, obj) => {
acc[obj.subjectName] = (acc[obj.subjectName] || 0) + 1;
return acc;
}, {});
console.log(count); // { JavaScript: 2, Java: 1 }