Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

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 함수를 작성해야 합니다.

함수는 개체의 '주제' 속성을 기반으로 중복 항목을 제거해야 합니다. 또한 함수는 단일 개체의 고유 개체에 대한 모든 점수와 학생 수를 추가해야 합니다.

따라서 위의 배열의 경우 출력은 다음과 같아야 합니다. -

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