ค่าเฉลี่ยของอาร์เรย์ภายในวัตถุ

ฉันมีอาร์เรย์ของวัตถุที่มีชื่อและเครื่องหมายของนักเรียน เหมือนด้านล่าง

ฉันต้องคำนวณคะแนน 'เฉลี่ย' ที่นักเรียนแต่ละคนมี และเปรียบเทียบคะแนน 'เฉลี่ย' เพื่อให้ได้นักเรียนที่เก่งที่สุด ฉันกำลังลองแบบด้านล่าง ฉันไม่เข้าใจสิ่งที่ฉันขาดหายไปใช่ไหม

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 ได้อย่างไร เช่น Alin มีค่าเฉลี่ย .. และ Bob มีค่าเฉลี่ย .. เช่นการพิมพ์ตัวเลขเฉลี่ยสำหรับนักเรียนแต่ละคน - person Sal; 12.10.2020
comment
@Sal คุณเพียงแค่ต้องพิมพ์วงในหรือต่อท้ายตัวแปรเช่น var msg = Students[i]["name"] + " has average mark: " + average; - person Doston; 12.10.2020
comment
@Sal ฉันได้อัปเดตคำตอบแล้วคุณสามารถดูว่าฉันพิมพ์ลงใน cansole ได้อย่างไร - person Doston; 12.10.2020
comment
สวัสดีดอสตัน ขอบคุณสำหรับเวลาของคุณ ฉันต้องการเพิ่มตัวเลขเฉลี่ยให้กับวัตถุเพื่อให้กลายเป็น [{name:Bob, เฉลี่ย : 89}, {name:alin, เฉลี่ย : 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