Есть ли способ применить условие в объекте?

Мне нужно предоставить решение для отображения наивысшего балла ученика в классе.

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 }
 // }

Остерегайтесь пограничного случая: несколько учеников (в одном классе) с одинаковым наивысшим баллом.

EthanB 20.01.2019 10:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете 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 и сокращения? Так как я все еще на начальном уровне, и мы должны использовать только простые методы и простой цикл.

Andy Lazuardy Putra 20.01.2019 13:43

Для этих целей const работает идентично var. Это просто объявление имени переменной. (Он имеет дополнительную защиту, поскольку переменные const не поднимаются и не могут быть переназначены, но это не имеет значения для кода здесь. Лучше всегда использовать const по умолчанию при объявлении переменных)

CertainPerformance 20.01.2019 21:30
.reduceявляется — наиболее подходящий метод для такого рода вещей. На каждой итерации он принимает аккумулятор (a), который представляет собой либо переданное начальное значение (здесь {}), либо то, что было возвращено на последней итерации (return a). Если вам удобнее использовать forEach, вы можете использовать const a = {}; arr.forEach((student) => { ... }); return Object.values(a);.
CertainPerformance 20.01.2019 21:30

Мое текущее решение выглядит следующим образом.

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

Другие вопросы по теме