Среднее значение массива внутри объекта

У меня есть массив объектов, который содержит имена и оценки студентов. как ниже

Мне нужно рассчитать «средние» оценки каждого ученика и сравнить «средние» оценки, чтобы получить лучшего ученика. Я пытаюсь, как показано ниже, я не понимаю, что мне не хватает?

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)

Мне нужно иметь средние оценки каждого ученика, чтобы сравнить результаты всех учеников.


person Sal    schedule 12.10.2020    source источник


Ответы (6)


Если вы ищете традиционный цикл:

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
Привет спасибо. Я хотел традиционным способом. Как я могу использовать console.log, поскольку, например, у Алина было среднее .. и у Боба было среднее .. например, печатать средние числа для каждого ученика? - person Sal; 12.10.2020
comment
@Sal, вам просто нужно напечатать внутри цикла или добавить к переменной, например var msg = Students[i]["name"] + " has average mark: " + average; - person Doston; 12.10.2020
comment
@Sal Я обновил свой ответ, вы можете увидеть, как я напечатал его в кансоле. - person Doston; 12.10.2020
comment
Привет Достон, спасибо за ваше время. Я хочу добавить к объекту средние числа, чтобы он стал [{имя: Боб, среднее: 89}, {имя: алин, среднее: 87}], и отсортировать массив, чтобы я мог иметь самый высокий средний показатель. количество. если у Алин и Боба одинаковое число, мне нужно это тоже сравнить. не могли бы вы направить меня дальше? - person Sal; 12.10.2020
comment
@Sal Добро пожаловать, я думаю, вы должны принять мой ответ, если ваша проблема решена. Для вашего следующего вопроса, пожалуйста, создайте новый вопрос, и мы будем работать над этим - person Doston; 12.10.2020
comment
принято :) Я создаю новый вопрос и отправляю вам ссылку - person Sal; 12.10.2020
comment
вот ссылка на новый заголовок темы stackoverflow.com/questions/64320231/ - person Sal; 12.10.2020
comment
@Sal спасибо за согласие, я отправил свой ответ на ваш второй вопрос: stackoverflow.com/a/64321145/7186690 Пожалуйста , дайте мне знать, если у вас есть какие-либо проблемы - person Doston; 12.10.2020

Может быть, это:

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

Вот так. Он возвращает вам массив объектов с именем и средним баллом студентов.

Он также отсортирован от самого высокого среднего к самому низкому

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

Вам нужно reduce массив marks каждого Student, а не Student объекта, так как это не массив.

next — это следующее значение в массиве, а не следующий элемент в Students.

Наконец, поместите строку console.log внутрь цикла, чтобы распечатать все результаты.

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

Вы также можете извлечь его в функцию:

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

Ниже приведен один из способов поиска учащегося с максимальным средним значением с помощью 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;
}

Примечание. В приведенном выше примере я не учитывал, есть ли у нескольких учащихся одинаковое среднее значение.

Ниже приведен пример, который вернет всех студентов, если среднее значение одинаковое.

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