简体   繁体   中英

Javascript count same array of object values based on two values

Let's say we have an array of object like this

const studentRecord = [
 {
   name: 'John Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Steve Doe',
   gender: 'Male',
   grade: '85'
 },{
   name: 'Jane Doe',
   gender: 'Male',
   grade: '90'
 },{
   name: 'Mary Jane',
   gender: 'Female',
   grade: '85'
 },
]

I would like to count all students that are male that have the same grade and female students with the same grade something like this would be the output...

 85: {
       Male: 2,
       Female: 1,
     }
 90: {
       Female:1
     }

I only have this code so far

    const foo = {};
    studentRecord.reduce((prevVal, currentVal) => {
      foo[currentVal['gender']] = (foo[currentVal['gender']] || 0) + 1;
    });

Which only outputs {Male: 2, Female: 2}

When reducing into an object, create an object at the grade property first, if it doesn't exist. Then create an object at that grade's Male or Female property if it doesn't exist, and increment it:

 const studentRecord = [ { name: 'John Doe', gender: 'Male', grade: '85' },{ name: 'Steve Doe', gender: 'Male', grade: '85' },{ name: 'Jane Doe', gender: 'Male', grade: '90' },{ name: 'Mary Jane', gender: 'Female', grade: '85' }, ]; const results = studentRecord.reduce((a, { gender, grade }) => { if (!a[grade]) { a[grade] = {}; } a[grade][gender] = (a[grade][gender] || 0) + 1; return a; }, {}); console.log(results);

Or, without reduce :

 const studentRecord = [ { name: 'John Doe', gender: 'Male', grade: '85' },{ name: 'Steve Doe', gender: 'Male', grade: '85' },{ name: 'Jane Doe', gender: 'Male', grade: '90' },{ name: 'Mary Jane', gender: 'Female', grade: '85' }, ]; const results = {}; for (const { gender, grade } of studentRecord) { if (!results[grade]) { results[grade] = {}; } results[grade][gender] = (results[grade][gender] || 0) + 1; } console.log(results);

try this

 const studentRecord = [ { name: 'John Doe', gender: 'Male', grade: '85' },{ name: 'Steve Doe', gender: 'Male', grade: '85' },{ name: 'Jane Doe', gender: 'Male', grade: '90' },{ name: 'Mary Jane', gender: 'Female', grade: '85' }, ] const grades = {}; studentRecord.map(e => { if(!grades[e.grade]) grades[e.grade] = {Male:0,Female:0}; }); studentRecord.map(e => grades[e.grade][e.gender]++ ); document.getElementById("result").innerHTML = JSON.stringify(grades)
 <div id="result"></div>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM