Я искал веб-сайт, на котором я мог бы искать лучшие фильмы любого актера / актрисы, но не мог найти ни одного конкретного фильма, который предлагал бы то, что я хотел. Мне пришлось погуглить актера / актрису, затем найти его / ее фильмы, затем найти рейтинг каждого отдельного фильма и затем сравнить их. Это было неэффективно… поэтому я решил сделать для этого сайт.

Я нашел данные фильма с IMDB на kaggle. CSV содержит около 85 тысяч фильмов и более 175 тысяч актеров. CSV включает в себя все, что мне нужно, от названия фильма, имени актеров, его рейтинга IMDB и многого другого. Простая фильтрация по строке содержит со столбцом актеров, отсортированным по рейтингу, дала бы желаемый результат. Самое интересное - сделать из этого веб-сайт…

Ниже я расскажу о создании HTML и JavaScript, необходимых для работы веб-сайта.

HTML

Для создания веб-сайта я использовал Visual Studio Code (однако с этой работой справится любое программное обеспечение). Как только вы наберете ! + tab появится базовый шаблон html:

<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8">
<meta name=”viewport” content=”width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>

Первым шагом было добавление ссылки начальной загрузки, чтобы визуально улучшить веб-сайт и сделать его более удобным для пользователя. Этот шаг не является обязательным, но без него веб-сайт будет выглядеть так, как будто он был создан в 90-х годах.

Чтобы иметь возможность использовать бутстрап, я добавил это в шапку:

<link rel=”stylesheet” href=”https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity=”sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T” crossorigin=”anonymous”>

… Готово! Теперь я могу использовать бутстрап.

Я разделил ‹body› на две части: ввод и вывод. Ниже приведена часть ввода:

<body>
<div class=”container”>
<div class=”row”>
<div class=”col-md-12">
<h1 class=>Find Movies!</h1>
<h2 class=>Enter the name of an actor/actress to see his/her best movies!</h2>
<form id=”form”>
<input class=”form-control” id=”user-input” placeholder=”Enter actor/actress…”>
<button id=”button” class=”btn btn-secondary”>Find Movies!</button>
</form>

Первые 3 ‹div› для container, row и col-md-12 - это просто структура начальной загрузки для выровняйте содержимое в контейнере. Затем я создал заголовок, используя ‹h1›, и подзаголовок, используя ‹h2›.

Затем наступает важная часть. Я использовал ‹форму› с идентификатором (обратите внимание, что идентификаторы и классы важны для ссылки на файл JavaScript или стиль начальной загрузки). Внутри формы у меня есть ‹input› с классом для начальной загрузки, идентификатором для JavaScript и заполнителем для отображения на веб-сайте. Наконец, у меня есть ‹кнопка› с идентификатором для JavaScript и класс для начальной загрузки с некоторым текстом для отображения на веб-сайте.

Ниже представлена ​​выходная часть:

<table class="table" cellpadding="10">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Movie</th>
<th scope="col">Rating</th>
<th scope="col">Year</th>
<th scope="col">Description</th>
</tr>
</thead>
<tbody>
</div>
</div>
</div>

Я создал ‹table› с небольшим отступом (чтобы он выглядел лучше). Затем я создал ‹thead›, в котором создаются заголовки столбцов. После этого шага мне понадобилась строка для всех заголовков, отсюда ‹tr›, а затем все ‹th› для каждого столбца. Затем я закрыл ‹thead› и запустил ‹tbody›, где и будет отображаться результат. Наконец, я просто закрываю 3 элемента ‹div› из контейнера, row и col-md-12 от прежде.

Каркас сайта готов! С этого момента сайт должен выглядеть так:

Сравните с тем, как это выглядит без начальной загрузки:

Это знаменует конец HTML-части веб-сайта. Конечно, на данном этапе сайт вообще ничего не делает. Ему все еще нужен файл JavaScript, чтобы стать полезным.

JavaScript

Я использовал JavaScript для загрузки CSV, получения пользовательского ввода, фильтрации CSV и отображения результатов.

Требуется файл .js. Я назвал его app.js и сохранил в папке рядом с html- и CSV-файлами.

Я использовал D3, невероятно полезную библиотеку JavaScript для управления документами на основе данных. Мне нужно было добавить скрипт в заголовок html, чтобы использовать D3:

<script src=”https://d3js.org/d3.v5.min.js"></script>

Все зависит от данных из CSV, поэтому первое, что нужно сделать, - это использовать D3 для чтения CSV, а затем применить функцию:

d3.csv(“movies.csv”).then(function (data) {
var movies = data;
var button = d3.select(“#button”);
var form = d3.select(“#form”);
button.on(“click”, runEnter);
form.on(“submit”, runEnter);

Я создал 3 переменные: movies, который ссылался на CSV, button, который ссылался на кнопку в html, и form, который ссылался на форму в HTML. Использование button.on («щелчок», runEnter) и form.on («submit», runEnter) позволяет пользователю либо нажать кнопку на нашем веб-сайте, либо нажать клавишу возврата, и javascript запустит функцию runEnter.

Теперь мы можем определить нашу функцию runEnter, которую я объясняю более подробно, поскольку это самая важная часть:

// Defining the function
function runEnter() {

// This line of code selects the <tbody> from the html and clears it. If this is not used, then the results would appear on top of the previous result.
d3.select(“tbody”).html(“”) 

// This code is needed to prevent the page from reloading.
d3.event.preventDefault(); 

// This code will get the user's input from what the user will type in the html <input> since we assigned it the "user-input" id. It will get the value and store it in our inputValue variable
var inputValue = d3.select(“#user-input”).property("value");

// This code will filter the movies looking at the actors column. It will store the values when there is a match from the text sequence the user entered and the text from our actors column from the CSV data.
var filteredMovies = 
movies.filter(movies => movies.actors.includes(inputValue));

// This was the easiest approach I found to sort the results by a different column in descending order. I had to include a new script in my head to use the _.sortBy 
This is the script:  
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/0.10.0/lodash.min.js"></script>
var output = _.sortBy(filteredMovies, ‘avg_vote’).reverse()

// Once I had all the values in my output variable, all I needed was to loop through them and add them to the table one by one. This was done using d3, where I inserted the value for each one of the columns I wanted using the necessary html to fit each table row.
for (var i = 0; i < filteredMovies.length; i++) {
d3.select(“tbody”).insert(“tr”).html(
“<td>” + [i+1] + ”</td>” +
”<td>” + (output[i][‘original_title’])+”</a>”+“</td>” + 
”<td>” + (output[i][‘avg_vote’])+”</td>” +
”<td>” + (output[i][‘year’])+”</td>” +
”<td>” + (output[i][‘description’])+”</td” ) }
};
});

Это все, что касается кодирования! Чтобы сделать сайт работоспособным, все, что осталось, это добавить скрипт в html сайта (я добавил его в шапку):

<script src=”app.js”></script>

Вы можете добавить много стиля, используя CSS или загрузив шаблоны и добавив свой код, чтобы ваш сайт выглядел так, как вы хотите!

Исход

Вы можете увидеть и использовать мою окончательную версию ЗДЕСЬ.