Fügen Sie ein neues Element in ein Array von Objekten ein und sortieren Sie das Array

Oct 12 2020

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

1 Barmar Oct 12 2020 at 15:04

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}`);

1 Doston Oct 12 2020 at 15:51

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

trincot Oct 12 2020 at 15:07

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);

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

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);