สมมติว่ามีอาร์เรย์ของออบเจ็กต์ดังนี้:
const arr = [
{ "SupplierName" : "John", "Category " : "A", "Points" : 3 },
{ "SupplierName" : "John", "Category " : "A", "Points" : 11 },
{ "SupplierName" : "John", "Category " : "A", "Points" : undefined },
{ "SupplierName" : "John", "Category " : "B", "Points" : 2 },
{ "SupplierName" : "John", "Category " : "B", "Points" : 6 },
{ "SupplierName" : "Praveen", "Category " : "A", "Points" : 3 },
{ "SupplierName" : "Praveen", "Category " : "A", "Points" : 7 }
];
เราต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ดังกล่าว ฟังก์ชันควรทำสิ่งต่อไปนี้:
- จัดกลุ่มซัพพลายเออร์ที่ซ้ำกันเป็นออบเจ็กต์ที่ไม่ซ้ำกัน (โดย "ซ้ำ" หมายถึงออบเจ็กต์ที่มีฟิลด์ "SupplierName" และ "Category" เหมือนกัน)
- รวมคะแนน (Points) ของพวกเขาเข้าด้วยกัน
- เพิ่มฟิลด์ "Average" ใหม่ในแต่ละออบเจ็กต์ ซึ่งมีค่าเฉลี่ยคะแนนของซัพพลายเออร์คนนั้น
ดังนั้น ผลลัพธ์สุดท้ายควรเป็นดังนี้:
const output = [
{ "SupplierName" : "John", "Category " : "A", "Points" : 14, "Average" : 7 },
{ "SupplierName" : "John", "Category " : "B", "Points" : 8, "Average" : 4 },
{ "SupplierName" : "Praveen", "Category " : "A", "Points" : 10, "Average" : 5 }
];
ตัวอย่าง
const arr = [
{ "SupplierName" : "John", "Category " : "A", "Points" : 3 },
{ "SupplierName" : "John", "Category " : "A", "Points" : 11 },
{ "SupplierName" : "John", "Category " : "A", "Points" : undefined },
{ "SupplierName" : "John", "Category " : "B", "Points" : 2 },
{ "SupplierName" : "John", "Category " : "B", "Points" : 6 },
{ "SupplierName" : "Praveen", "Category " : "A", "Points" : 3 },
{ "SupplierName" : "Praveen", "Category " : "A", "Points" : 7 }
];
const groupAndAverage = (arr = []) => {
const groups = arr.reduce((acc, obj) => {
const name = obj.SupplierName + obj.Category;
if (acc[name]) {
if (obj.Points) (acc[name].Points += obj.Points) && ++acc[name].Average;
}
else {
acc[name] = obj;
acc[name].Average = 1;
// ใช้ 'Average' เป็นตัวนับจำนวนรายการ (ในขั้นแรก)
};
return acc;
}, {});
// หาค่าเฉลี่ยของ Points
const res = Object.keys(groups).map( name => {
groups[name].Average = Math.round(groups[name].Points/groups[name].Average);
return groups[name];
});
return res;
};
console.log(JSON.stringify(groupAndAverage(arr), undefined, 4));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็นดังนี้:
[
{
"SupplierName": "John",
"Category ": "A",
"Points": 22,
"Average": 6
},
{
"SupplierName": "Praveen",
"Category ": "A",
"Points": 10,
"Average": 5
}
]