Это правильный способ создать список из массива с объектами?

Я недавно изучал ES6. Я следую за курсом Уэса Боса «ES6 для всех» и хотел сам написать сценарии, чтобы проверить, насколько я усвоил ценную информацию.

В этом коде я пытаюсь создать список HTML из заданной переменной, которая представляет собой массив с объектами внутри. Итак, в конце концов я заставил этот код работать, но я не уверен, правильный ли это способ сделать это, не могли бы вы взглянуть на него и сказать мне, что можно исправить и изменить для лучшего решения? Спасибо

const list = document.createElement('ul');
const students = [{
    name: 'Tom',
    gpa: 4.2,
    course: 'MKDf-16/1',
    gender: 'male'
  },
  {
    name: 'Artiom',
    gpa: 2.2,
    course: 'MKDf-16/1',
    gender: 'male'
  },
  {
    name: 'Alison',
    gpa: 4.8,
    course: 'MKDf-16/2',
    gender: 'female'
  },
  {
    name: 'John',
    gpa: 4.1,
    course: 'MKDf-16/5',
    gender: 'male'
  }
];

const output = students.map(student => {
  return `
            ${student.name}'s GPA is ${student.gpa}
        `
});

output.forEach((x, index) => {
  console.info(output[index]);
  let listItem = document.createElement('li');
  listItem.innerHTML = output[index];
  list.appendChild(listItem);
});

document.body.appendChild(list);

Лучше использовать const, а не let, если вы не собираетесь переназначать рассматриваемую переменную. Лучше назначить textContent элемента, чем его innerHTML, если вы вставляете текст. Используйте аргумент первый функции forEach для ссылки на элемент в массиве - не используйте index, если вам не нужно.

CertainPerformance 07.06.2018 10:29

Код мне нравится, возможно, вы сможете объединить map и forEach

gurvinder372 07.06.2018 10:30

не обязательно ошибаться с этим кодом - однако CodeReview лучше публиковать, чем SO tbh ...

Denis Tsoi 07.06.2018 10:30

Для функции стрелки вы можете удалить фигурные скобки и оператор возврата: () => `${student.name}'s ....`

Crackers 07.06.2018 10:32

Спасибо вам, ребята! Я очистил свой код после этих предложений: codepen.io/anon/pen/LrRerY

Kirdeika 07.06.2018 10:39
Поведение ключевого слова "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) для оценки ваших знаний,...
2
5
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

const students = [{
    name: 'Tom',
    gpa: 4.2,
    course: 'MKDf-16/1',
    gender: 'male'
  },
  {
    name: 'Artiom',
    gpa: 2.2,
    course: 'MKDf-16/1',
    gender: 'male'
  },
  {
    name: 'Alison',
    gpa: 4.8,
    course: 'MKDf-16/2',
    gender: 'female'
  },
  {
    name: 'John',
    gpa: 4.1,
    course: 'MKDf-16/5',
    gender: 'male'
  }
];

const list = document.createElement('ul');
list.innerHTML = students.map(ob => `<li>${ob.name}'s GPA is ${ob.gpa}</li>`).join("");
document.body.appendChild(list);

Да! Я так и искал. Помню, где-то видел лайнер, но не нашел. Большое спасибо, Роко

Kirdeika 07.06.2018 10:40

А как насчет студента по имени <script>location = "http://thatpornsite.com";</script>? :-)

6502 07.06.2018 10:43

Ха-ха, да, я знаю о XSS, конечно, я смотрю, - объясняет Уэс о дезинфекции входных данных.

Kirdeika 07.06.2018 12:52

@ 6502 такой студент должен быть экранирован в вашей базе данных, а не тогда, когда такие данные возвращаются в представление.

Roko C. Buljan 07.06.2018 12:54

@ RokoC.Buljan: сбежал в базе данных? База данных - это данные, и ее даже не должно волновать, что вы собираетесь использовать HTML. Вы атакуете проблему не с той стороны ...

6502 07.06.2018 14:06

@ 6502, значит, вы говорите, что мы должны хранить необработанные строки в базе данных? Я буду записывать. В любом случае createElement или парсер - всегда лучшее решение, но вам не следует бояться использования innerHTML (или .html() в jQuery), когда вы знаете, что делаете :)

Roko C. Buljan 07.06.2018 14:20

@ RokoC.Buljan: Я думаю, что база данных должна содержать реальные данные (что, если вам нужно написать какую-то программу для их извлечения и создания, например, стороны сервера PDF?). Кроме того, с искаженными данными даже запросы становятся проблематичными, поскольку вам также необходимо искажать их, иначе неискаженный текст в запросе не будет соответствовать. На мой взгляд, даже веб-сервис должен возвращать данные JSON с неискаженным содержимым базы данных ... презентация - это проблема клиента, которая просто должна нам использовать правильные инструменты (и это не просто взять содержимое JSON - предположительно текст - и проанализировать его как HTML).

6502 07.06.2018 14:57

«Правильный» способ - это, вероятно, не использовать innerHTML для анализа содержимого, которое включает внешние данные. Гораздо лучше создать элементы <li> и вместо них установить их textContent, избегая безумной очистки и цитирования.

К сожалению, базовый синтаксис Javascript для создания элементов и установки их содержимого довольно уродлив и многословен. В моем коде обычно я получить функцию полезности для этого и такой код:

el("ul", {},
   ...(content.map(x =>
       el("li", {textContent: `${x.name} GPA is ${x.gpa}`}))));

может создать узел ul, содержащий по одному узлу li для каждого элемента в массиве content.

Никакого анализа HTML, цитирования или очистки не требуется.

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