สมมติว่าเรามีอาร์เรย์ของวัตถุที่มีข้อมูลเกี่ยวกับนักเรียนบางคนและเครื่องหมายของพวกเขาเช่นนี้ -
const arr = [ { subject: 'Maths', marks: '40', noOfStudents: '5' }, { subject: 'Science', marks: '50', noOfStudents: '16' }, { subject: 'History', marks: '35', noOfStudents: '23' }, { subject: 'Science', marks: '65', noOfStudents: '2' }, { subject: 'Maths', marks: '30', noOfStudents: '12' }, { subject: 'History', marks: '55', noOfStudents: '20' }, ];
เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ดังกล่าว
ฟังก์ชันควรกำจัดรายการที่ซ้ำซ้อนโดยพิจารณาจากคุณสมบัติ 'หัวเรื่อง' ของออบเจกต์ นอกจากนี้ ฟังก์ชันควรเพิ่มเครื่องหมายทั้งหมดและไม่มีนักเรียนสำหรับวัตถุเฉพาะในวัตถุชิ้นเดียว
ดังนั้น สำหรับอาร์เรย์ข้างต้น ผลลัพธ์ควรมีลักษณะดังนี้ −
const output = [ { subject: 'Maths', marks: '70', noOfStudents: '17' }, { subject: 'Science', marks: '115', noOfStudents: '18' }, { subject: 'History', marks: '95', noOfStudents: '43' }, ];
ตัวอย่าง
รหัสสำหรับสิ่งนี้จะเป็น −
const arr = [ { subject: 'Maths', marks: '40', noOfStudents: '5' }, { subject: 'Science', marks: '50', noOfStudents: '16' }, { subject: 'History', marks: '35', noOfStudents: '23' }, { subject: 'Science', marks: '65', noOfStudents: '2' }, { subject: 'Maths', marks: '30', noOfStudents: '12' }, { subject: 'History', marks: '55', noOfStudents: '20' }, ]; const groupBySubject = (arr = []) => { const map = {}; let res = []; res = arr.reduce((acc, val) => { const { subject, marks, noOfStudents } = val; const { length: l } = acc; if(map.hasOwnProperty(subject)){ acc[map[subject]]['marks'] = +marks; acc[map[subject]]['noOfStudents'] = +noOfStudents; } else{ map[subject] = l; acc.push({ subject: subject, marks: +marks, noOfStudents: +noOfStudents }); }; return acc; }, []); return res; }; console.log(groupBySubject(arr));
ผลลัพธ์
และผลลัพธ์ในคอนโซลจะเป็น −
[ { subject: 'Maths', marks: 30, noOfStudents: 12 }, { subject: 'Science', marks: 65, noOfStudents: 2 }, { subject: 'History', marks: 55, noOfStudents: 20 } ]