Мне нужно предоставить решение для отображения наивысшего балла ученика в классе.
function highestScore (students) {
// код здесь }
// TEST CASE
console.info(highestScore([
{
name: 'Daisy',
score: 90,
class: 'foxes'
},
{
name: 'Alexander',
score: 85,
class: 'wolves'
},
{
name: 'Sergio',
score: 74,
class: 'foxes'
},
{
name: 'Anabelle',
score: 78,
class: 'wolves'
}
]));
From the parameter, the function would return the name of each class and
display the highest student's name and score of that student.
function highestScore (students) {
var classes = {};
var scores = [];
for(i=0; i<students.length; i++){
var inputClass = students[i].class;
var inputScore = students[i].score;
var inputName = students[i].name;
var classScore = [];
var isExist = false;
var object = Object.values(class);
return classScore;
}
// TEST CASE
console.info(highestScore([
{
name: 'Daisy',
score: 90,
class: 'foxes'
},
{
name: 'Alexander',
score: 85,
class: 'wolves'
},
{
name: 'Sergio',
score: 74,
class: 'foxes'
},
{
name: 'Anabelle',
score: 78,
class: 'wolves'
}
]));
The result would show something like this.
// {
// foxes: { name: 'Daisy', score: 90 },
// wolves: { name: 'Alexander', score: 85 }
// }



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете reduce в объект, ключи которого являются именами классов, значениями которых являются в настоящее время самые высокие ученики для этого класса. На каждой итерации, если в классе еще нет значения, назначьте учащегося, в противном случае назначьте учащегося, только если учащийся уже в этом классе имеет более низкий балл:
function highestScore(arr) {
const highestByClass = arr.reduce((a, student) => {
const { class: className, score } = student;
if (!a[className] || a[className].score < score) {
a[className] = student;
}
return a;
}, {});
return Object.values(highestByClass);
}
console.info(highestScore([
{
name: 'Daisy',
score: 90,
class: 'foxes'
},
{
name: 'Alexander',
score: 85,
class: 'wolves'
},
{
name: 'Sergio',
score: 74,
class: 'foxes'
},
{
name: 'Anabelle',
score: 78,
class: 'wolves'
}
]));Спасибо за помощь, приятель. Но есть ли способ решить проблему без использования const и сокращения? Так как я все еще на начальном уровне, и мы должны использовать только простые методы и простой цикл.
Для этих целей const работает идентично var. Это просто объявление имени переменной. (Он имеет дополнительную защиту, поскольку переменные const не поднимаются и не могут быть переназначены, но это не имеет значения для кода здесь. Лучше всегда использовать const по умолчанию при объявлении переменных)
.reduceявляется — наиболее подходящий метод для такого рода вещей. На каждой итерации он принимает аккумулятор (a), который представляет собой либо переданное начальное значение (здесь {}), либо то, что было возвращено на последней итерации (return a). Если вам удобнее использовать forEach, вы можете использовать const a = {}; arr.forEach((student) => { ... }); return Object.values(a);.
Мое текущее решение выглядит следующим образом.
function highestScore (students) {
var object = {};
var result = [];
for (var i=0; i<students.length; i++){
var nameInput = students[i].name
var scoreInput = students[i].score
var classInput = students[i].class
if (object[classInput] === undefined){
object[classInput] = {
name: nameInput,
score: scoreInput,
}
}
for(var j=0; j<students.length; j++){
if (students[j].class === object[students[i].class] && students[j].score > object[students[i].class].score){
object[classInput] = {
name: students[j].name,
score: students[j].score,
}
}
}
}
return object;
}
Однако я не мог вставить новое значение, если ученики, следующие за ним, имеют более высокий балл, чем первоначальный.
// TEST CASE
console.info(highestScore([
{
name: 'Dimitri',
score: 90,
class: 'foxes'
},
{
name: 'Alexei',
score: 85,
class: 'wolves'
},
{
name: 'Sergei',
score: 94,
class: 'foxes'
},
{
name: 'Anastasia',
score: 78,
class: 'wolves'
}
]));
Остерегайтесь пограничного случая: несколько учеников (в одном классе) с одинаковым наивысшим баллом.