Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การรวมค่า property ของอาร์เรย์ออบเจกต์เป็นอาร์เรย์ออบเจกต์ใหม่ใน JavaScript

สมมติเรามีอาร์เรย์ของออบเจกต์ที่มีข้อมูลนักเรียนและคะแนนแบบนี้:

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 ที่รับอาร์เรย์แบบนี้เข้ามา ฟังก์ชันควรลบรายการซ้ำตาม property 'subject' และบวกค่า marks และ noOfStudents ของ subject เดียวกันรวมในออบเจกต์เดียว

ดังนั้น สำหรับอาร์เรย์ข้างต้น ผลลัพธ์ควรเป็น:

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 }
]