Masukkan elemen baru ke dalam array objek dan urutkan array

Oct 12 2020

Saya memiliki array objek yang berisi nama dan nilai siswa. seperti dibawah ini

Bagaimana saya dapat menghitung nilai 'rata-rata' yang dimiliki setiap siswa dan membandingkan nilai 'rata-rata' untuk mendapatkan siswa terbaik. Saya tidak ingin menggunakan ES6

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


var average;
var newArray = [];
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;
  newArray.push(average)
  var msg = Students[i]["name"] + " has average mark: " + average;
  console.log(msg)

}

console.log(newArray)

Saya ingin memasukkan angka rata-rata dalam sebuah objek bersama dengan nama seperti [{name: "Bob", average: 89.4}, {name: "Alin", average: 87.2}, {name: "Bikash", average: 89.4 }] dan urutkan objeknya.

Akhirnya, saya ingin memiliki console.log karena Bob adalah siswa teratas ATAU Alin dan Bob adalah siswa paling cerdas (jika keduanya memiliki jumlah rata-rata yang sama)

Jawaban

1 Barmar Oct 12 2020 at 15:04

Jangan mendorong rata-rata ke dalam larik baru, tambahkan sebagai properti Students[i]dengan Students[i].average = average;.

Kemudian Anda dapat mengurutkan array menggunakan properti itu, dan mencetak ke siswa dari array yang diurutkan.

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


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

}
Students.sort((s1, s2) => s2.average - s1.average);
var topAvg = Students[0].average;
var topStudents = Students.filter(s => s.average == topAvg).map(s => s.name).join(", ");
console.log(`Top Students are ${topStudents} with mark ${topAvg}`);

1 Doston Oct 12 2020 at 15:51

Saya telah menggunakan functins non ES6, bukan tradisional untuk loop dan lainnya. Temukan jawaban untuk tiga pertanyaan Anda:

  • Membuat list / array objek dalam format ini: [{name: 'Alin', average: 68.8}, ..]

  • Menyortir daftar / larik dengan nilai rata-rata

  • Mendapatkan siswa dengan nilai rata-rata tertinggi.

         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],
         },
         {
             name: 'Doston',
             marks: [78, 80, 89, 90, 68],
         },
     ];
    
     var average;
     var data = [];
     for (var 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;
    
         var msg = Students[i]["name"] + " has average mark: " + average;
         console.log(msg);
    
         // Answer for the first question:
         var item = {"name": Students[i]["name"], "average": average};
         data.push(item);
    
     }
    
     function compareAndSort(a,b) {
         return parseInt(a.average, 10) - parseInt(b.average, 10);
     }
    
     data.sort(compareAndSort);
    
     // Answer for the second question: sort [ { name: 'Alin', average: 68.8 }, ..]
     console.log(data);
    
     // Answer for the third question - getting students who has highest mark is last since it is sorted
     var bestStudent = data[data.length - 1];
     console.log(bestStudent.name + " has got the highest mark: " + bestStudent.average);
    
     var bestStudents = [bestStudent];
    
     // check if there is only one person with this highest mark
     for (var i = 0; i < data.length; i ++) {
         if (data[i].average >= bestStudent.average && data[i].name !== bestStudent.name) {
             bestStudents.push(data[i]);
         }
     }
    
     // all best students
     console.log(bestStudents);
    

Saya telah menambahkan beberapa data ke input JSON, sehingga Anda mendapatkan dua siswa terbaik

trincot Oct 12 2020 at 15:07

Anda tidak membutuhkan larik tambahan. Secara teori, menelepon sortkurang efisien daripada mengumpulkan siswa terbaik selama loop Anda.

Begitu:

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

var topAverage = -1; 
var topStudents = [];
var newArray = [];
for (let i = 0; i < students.length; i++){
    var marks = students[i].marks;
    var total = 0;
    for (var j = 0; j < marks.length; j++ ) {
        total += marks[j];
    }
    var average = total / marks.length;
    // Keep topAverage & topStudents up to date:
    if (average >= topAverage) {
        if (average > topAverage) {
            topStudents.length = 0; // clear previous content
            topAverage = average;
        }
        topStudents.push(students[i].name);
    }
}

console.log("Top student(s): " + topStudents + " with an average of " + topAverage);

MikhailVladimirov Oct 12 2020 at 15:13

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

console.log (
  Students.map (
    student => (
      {
        name: student.name,
        average:
          student.marks.reduce ((a, m) => a + m, 0) /
          student.marks.length
      }
    )
  ).sort ((a, b) => b.average - a.average)
);

ElectricShadow Oct 12 2020 at 15:05

Alih-alih menggunakan loop, saya menggunakan metode array bawaan, yang cenderung jauh lebih mudah dibaca (meskipun akan jauh lebih mudah dibaca jika Anda menggunakan sintaks ES6).

Saya menggunakan Array.prototype.mapmetode untuk mengubah daftar nilai menjadi rata-rata. Untuk menemukan rata-rata ini, saya menggunakan Array.prototype.reduceuntuk menjumlahkan semua nilai, dan kemudian saya membaginya dengan panjang array tanda. Saya kemudian mengurutkan array menggunakan Array.prototype.sort.

Untuk mendapatkan siswa terbaik, saya menggunakan Array.prototype.filteruntuk memilih hanya siswa yang nilai rata-rata akan sama dengan nilai rata-rata teratas, yang karena averagesarray diurutkan, akan averages[0].average.

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

var averages = Students.map(function(student) {
  return {
    name: student.name,
    average: student.marks.reduce(function(a, b) {
      return a + b;
    }) / student.marks.length
  };
}).sort(function(a, b) {
  return b.average - a.average;
});

var top_students = averages.filter(function(student, _i, arr) {
  return student.average === arr[0].average;
});

console.log("Averages:");
console.log(averages);

console.log("Top Students:\n");
console.log(top_students);