#javascript #arrays
Вопрос:
У меня есть массив объектов с именами и оценками некоторых учеников. Я должен отсортировать их в порядке убывания, который у меня есть, используя метод forEach, однако я не могу понять, как вызвать его в addEventListener, чтобы при нажатии кнопки в моем браузере отображались имя и оценки учащихся. В HTML-документе у меня есть только один пустой абзац с идентификатором «#демонстрация» и кнопка с идентификатором «#showStudents», которая должна отображать имена и оценки в пустом абзаце при нажатии. Ниже я прикрепил код:
const studentsOrder = document.getElementById("demo");
const showStudents = document.getElementById("showStudents");
const students = [
{
name: "Michael",
grade: 9,
},
{
name: "Tom",
grade: 6,
},
{
name: "Lisa",
grade: 8,
},
{
name: "Ron",
grade: 5,
},
{
name: "Daniel",
grade: 3,
},
{
name: "John",
grade: 2,
},
{
name: "Louise",
grade: 7,
},
];
students.sort((a, b) => b.grade - a.grade);
students.forEach((e) => {
console.log(`${e.name} ${e.grade}`);
});
Комментарии:
1. Поместите код в прослушиватель событий и заставьте его обновлять DOM с результатом вместо использования
console.log()
. С какой частью этого у тебя проблемы?2. Где HTML и код, пытающийся его изменить? Прямо сейчас это выглядит так, как будто вы просите кого-то написать это за вас. Мы бы предпочли научить вас, что не так с тем, что вы пробовали.
3. @Barmar, вот с чем у меня проблемы: я не могу понять, как поместить код в прослушиватель событий вместо использования console.log().
4. @Teodor-MihaiAvasilcai Ваш существующий код даже не пытается изменить DOM или установить четный прослушиватель.
studentsOrder.addEventListener('click', ()=> students.forEach((e) => { showStudents.innerHTML = `${e.name} ${e.grade} <br />`); });
Это очень грубо… просто чтобы ты начал5. @Teodor-MihaiAvasilcai ты видел мой ответ?
Ответ №1:
На основе ваших комментариев вам придется прикрепить слушателя к кнопке #showStudents
и показать их в #demo
const studentsOrder = document.getElementById("demo");
const showStudents = document.getElementById("showStudents");
const students = [{
name: "Michael",
grade: 9,
},
{
name: "Tom",
grade: 6,
},
{
name: "Lisa",
grade: 8,
},
{
name: "Ron",
grade: 5,
},
{
name: "Daniel",
grade: 3,
},
{
name: "John",
grade: 2,
},
{
name: "Louise",
grade: 7,
},
];
students.sort((a, b) => b.grade - a.grade);
showStudents.addEventListener('click', () => {
studentsOrder.innerHTML = ''
students.forEach(e => studentsOrder.innerHTML = `${e.name} ${e.grade} <br />`);
})
<button id="showStudents">Show Students</button>
<div id="demo"></div>
Однострочным решением может быть использование метода reduce (), что-то вроде этого:
const studentsOrder = document.getElementById("demo");
const showStudents = document.getElementById("showStudents");
const students = [{
name: "Michael",
grade: 9,
},
{
name: "Tom",
grade: 6,
},
{
name: "Lisa",
grade: 8,
},
{
name: "Ron",
grade: 5,
},
{
name: "Daniel",
grade: 3,
},
{
name: "John",
grade: 2,
},
{
name: "Louise",
grade: 7,
},
];
students.sort((a, b) => b.grade - a.grade);
showStudents.addEventListener('click', () => studentsOrder.innerHTML = students.reduce((accumulator, student) => `${accumulator} <br /> ${student.name} ${student.grade}`, ''))
<button id="showStudents">Show Students</button>
<div id="demo"></div>
Комментарии:
1. Может потребоваться сначала очистить DIV, чтобы он не дублировался каждый раз.
2. Нет необходимости сортировать массив каждый раз, когда вы нажимаете кнопку
3. @JuanMendes это правда, исправлено
4. Поскольку вы взяли на себя ответ, последнее предложение состоит в том, чтобы избегать воссоздания DOM для каждой итерации ( установите HTML одним кадром) :p и превратите его в одну строку.
studentsOrder.innerHTML = students.reduce((str, student) => `${str} <br /> ${student.name} ${student.grade}`, '')
5. Да, это было бы хорошим «обновлением», скажем 😉 Я добавлю это к своему ответу