Fügen Sie ein neues Element in ein Array von Objekten ein und sortieren Sie das Array
Ich habe eine Reihe von Objekten, die den Namen und die Noten der Schüler enthalten. Wie unten
Wie kann ich die Durchschnittsnoten jedes Schülers berechnen und die Durchschnittsnoten vergleichen, um den besten Schüler zu erhalten? Ich möchte ES6 nicht verwenden
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)
Ich möchte die durchschnittlichen Zahlen in ein Objekt zusammen mit Namen wie [{Name: "Bob", Durchschnitt: 89,4}, {Name: "Alin", Durchschnitt: 87,2}, {Name: "Bikash", Durchschnitt: 89,4 einfügen }] und sortiere das Objekt.
Schließlich möchte ich console.log haben, da Bob der Top-Schüler ist ODER Alin und Bob die klügsten Schüler sind (falls beide die gleiche durchschnittliche Anzahl haben)
Antworten
Schieben Sie den Durchschnitt nicht in ein neues Array, sondern fügen Sie ihn als Eigenschaft von Students[i]with hinzu Students[i].average = average;.
Anschließend können Sie das Array mit dieser Eigenschaft sortieren und aus dem sortierten Array an die Schüler drucken.
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}`);
Ich habe Nicht-ES6-Funktionen verwendet, stattdessen traditionell für Loop und andere. Hier finden Sie Antworten auf Ihre drei Fragen:
Erstellen einer Liste / eines Arrays von Objekten in diesem Format: [{Name: 'Alin', Durchschnitt: 68,8}, ..]
Sortieren einer Liste / eines Arrays mit einem Durchschnittswert
Schüler mit der höchsten Durchschnittsnote bekommen.
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);
Ich habe der JSON-Eingabe einige Daten hinzugefügt, damit Sie zwei beste Schüler erhalten
Sie benötigen kein zusätzliches Array. Theoretisch ist das Anrufen sortweniger effizient als das Sammeln der besten Schüler während Ihrer Schleife.
Damit:
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);
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)
);
Anstatt Schleifen zu verwenden, habe ich die integrierten Array-Methoden verwendet, die in der Regel viel besser lesbar sind (obwohl sie bei Verwendung der ES6-Syntax viel besser lesbar wären).
Ich benutze die Array.prototype.mapMethode, um die Liste der Noten in den Durchschnitt umzuwandeln. Um diesen Durchschnitt zu ermitteln, Array.prototype.reduceaddiere ich alle Werte und dividiere dann durch die Länge des Markierungsarrays. Ich sortiere dann das Array mit Array.prototype.sort.
Um die besten Schüler zu erhalten, verwende ich Array.prototype.filter, um nur die Schüler auszuwählen, werden Durchschnittsnoten gleich der höchsten Durchschnittsnote, die, da das averagesArray sortiert ist, sein wird 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);