Rata-rata array di dalam suatu objek

Saya memiliki serangkaian objek yang berisi nama dan tanda siswa. seperti di bawah ini

Saya perlu menghitung nilai 'rata-rata' yang dimiliki setiap siswa dan membandingkan nilai 'rata-rata' untuk mendapatkan siswa terbaik. Saya mencoba seperti di bawah ini, saya tidak mendapatkan apa yang saya lewatkan?

var Students = [
  {
    name: "Bob",
    marks: [78,80,89,90,68]
  },
  {
    name: "Alin",
    marks: [87,60,59,70,68]
  },
  {
    name: "bikash",
    marks: [82,60,79,60,80]
  }
];


for (let i = 0; i < Students.length; i++){
  var average = Students[i].reduce((total, next)=> total + next.marks) /2 
}

console.log(average)

Saya perlu memiliki nilai rata-rata setiap siswa untuk membandingkan hasil Semua siswa


person Sal    schedule 12.10.2020    source sumber


Jawaban (6)


Jika Anda mencari loop tradisional:

const Students = [{
    name: 'Bob',
    marks: [78, 80, 89, 90, 68],
},
    {
        name: 'Alin',
        marks: [87, 60, 59, 70, 68],
    },
    {
        name: 'bikash',
        marks: [82, 60, 79, 60, 80],
    },
];

var average;
for (let i = 0; i < Students.length; i++){
    var marks = Students[i]["marks"];
    var total = 0;
    console.log(marks);
    for (var j = 0; j < marks.length; j++ ) {
        total += marks[j];
    }
    average = total / marks.length;

    // answer for question in the comment
    var msg = Students[i]["name"] + " has average mark: " + average;
    console.log(msg)

}

console.log(average)
person Doston    schedule 12.10.2020
comment
hai terima kasih. Saya menginginkannya dengan cara tradisional. Bagaimana saya bisa console.log misalnya Alin memiliki rata-rata .. dan Bob memiliki rata-rata .. seperti mencetak angka rata-rata untuk setiap siswa? - person Sal; 12.10.2020
comment
@Sal Anda hanya perlu mencetak di dalam loop, atau menambahkan ke variabel seperti var msg = Students[i]["name"] + " has average mark: " + average; - person Doston; 12.10.2020
comment
@Sal Saya telah memperbarui jawaban saya di sana Anda dapat melihat bagaimana saya mencetaknya di cansole - person Doston; 12.10.2020
comment
Hai Doston, terima kasih atas waktunya. Saya ingin menambahkan angka rata-rata ke objek sehingga menjadi [{name:Bob, average : 89}, {name:alin, average : 87}], dan mengurutkan arraynya sehingga saya dapat mengetahui siapa yang mendapat rata-rata tertinggi nomor. jika Alin dan Bob sama-sama mendapat nomor yang sama saya perlu membandingkannya juga. bisakah Anda membimbing saya lebih jauh? - person Sal; 12.10.2020
comment
@Sal sama-sama, saya pikir Anda harus menerima jawaban saya sebagai menerima jika masalah Anda teratasi. Untuk pertanyaan Anda berikutnya, silakan buat pertanyaan baru dan kami akan mengatasinya - person Doston; 12.10.2020
comment
diterima :) Saya membuat pertanyaan baru dan mengirimi Anda tautannya - person Sal; 12.10.2020
comment
di sini adalah link ke judul thread baru stackoverflow.com/questions/64320231/ - person Sal; 12.10.2020
comment
@Sal terima kasih telah menerima, saya telah memposting jawaban saya untuk pertanyaan kedua Anda: stackoverflow.com/a/64321145/7186690 Tolong , beri tahu saya jika Anda memiliki masalah apa pun - person Doston; 12.10.2020

Mungkin ini:

const students = [{
    name: 'Bob',
    marks: [78, 80, 89, 90, 68],
  },
  {
    name: 'Alin',
    marks: [87, 60, 59, 70, 68],
  },
  {
    name: 'bikash',
    marks: [82, 60, 79, 60, 80],
  },
];

const topStudent = students
  .map(student => ({
    ...student,
    averageMark: student.marks.reduce((a, b) => a + b, 0) / student.marks.length,
  }))
  .sort((a, b) => a.averageMark - b.averageMark)
  .pop();

console.log(topStudent);

person Iosif    schedule 12.10.2020

Ini dia. Ini mengembalikan Anda serangkaian objek dengan nama dan skor rata-rata siswa.

Ini juga diurutkan dari rata-rata tertinggi ke terendah

let arr = [
    {
        name: "Bob",
        marks: [78,80,89,90,68]
    },

    {
        name: "Alin",
        marks: [87,60,59,70,68]
    },

    {
        name: "bikash",
        marks: [82,60,79,60,80]
    }
]

let averages = arr.map(({ marks, name }) => {
   let average = marks.reduce((a,v) => a + v) / marks.length
   return { name , average }
}).sort((a,b) => b.average - a.average);

let [{ name }] = averages;

console.log(averages)
console.log("top student: ", name);

person Ifaruki    schedule 12.10.2020

Anda perlu reduce array marks dari setiap Student, bukan objek Student, karena ini bukan array.

next adalah nilai berikutnya dalam larik, bukan item berikutnya dalam Students.

Terakhir, tempatkan baris console.log di dalam loop agar semua hasil tercetak.

var Students = [
  {
    name: "Bob",
    marks: [78,80,89,90,68]
  },
  {
    name: "Alin",
    marks: [87,60,59,70,68]
  },
  {
    name: "bikash",
    marks: [82,60,79,60,80]
  }
];


for (let i = 0; i < Students.length; i++){
    var average = Students[i].marks.reduce((total, next)=> total + next) / Students[i].marks.length;
    console.log(average);
}

person JMP    schedule 12.10.2020

Anda juga dapat mengekstraknya dalam suatu fungsi:

var Students = [
  {
    name: "Bob",
    marks: [78,80,89,90,68]
  },
  {
    name: "Alin",
    marks: [87,60,59,70,68]
  },
  {
    name: "bikash",
    marks: [82,60,79,60,80]
  }
];

// Student avarage
var averages = []
for (let i = 0; i < Students.length; i++){
  var avg = average(Students[i].marks);
  console.log(Students[i].name + ": " + avg)
  averages.push(avg)
}

// Total average
console.log("total average: " + average(averages))

function average(array) {
  return array.reduce((total, mark) => total + mark, 0) / array.length;
}

person Greedo    schedule 12.10.2020

Di bawah ini adalah salah satu cara mencari siswa dengan rata-rata maksimal menggunakan Array.reduce, Array.map.

var Students = [{name:"Alin",marks:[87,60,59,70,68]},{name:"Bob",marks:[78,80,89,90,68]},{name:"bikash",marks:[82,60,79,60,80]}];

const getTopStudent = (students) => {
//Find the avg of the current student
  const formattedStudents = students.map(student => ({...student, avg: student.marks.reduce((t, m) => t+m, 0)/student.marks.length}))
  return formattedStudents.reduce((res, student) => {
      //Check if the avg of the student in res object is less than the avg of the current student, then return current student.
    if((res.avg || 0) < student.avg){
      return {
        ...student
      }
    }
    return res;
  }, {})
}

console.log(getTopStudent(Students))
.as-console-wrapper {
  max-height: 100% !important;
}

Catatan: Pada contoh di atas saya belum mempertimbangkan jika ada lebih dari satu siswa yang memiliki rata-rata yang sama.

Di bawah ini adalah contoh yang akan mengembalikan semua siswa jika rata-ratanya sama

var Students = [{name:"Alin",marks:[87,60,59,70,68]},{name:"Bob",marks:[78,80,89,90,68]},{name:"bikash",marks:[82,60,79,60,80]},{name:"Joey",marks:[78,80,84,90,73]}];

const getTopStudent = (students) => {
  const formattedStudents = students.map(student => ({ ...student,
    avg: student.marks.reduce((t, m) => t + m, 0) / student.marks.length
  }))
  const finalRes = formattedStudents.reduce((res, student) => {
  //if the res.avg is less than current student avg then update the res object with the new avg and the students
    if ((res.avg || 0) < student.avg) {
      return {
        avg: student.avg,
        students: [{ ...student }]
      }
    } else if ((res.avg || 0) === student.avg) {
    //If average of the current student is same as res.avg, then push the current student to the res.students
      res.students.push(student);
      return res;
    }
    return res;
  }, {});

  return finalRes.students;
}

//More than one student with max avg
console.log(getTopStudent(Students));

//One student with max avg
console.log(getTopStudent(Students.slice(0,3)));
.as-console-wrapper {
  max-height: 100% !important;
}

person Nithish    schedule 12.10.2020