Фильтровать видео YouTube по категории

0

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

Вот фрагмент данных о категории видео для региона США:

{
 "kind": "youtube#videoCategoryListResponse",
 "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/S730Ilt-Fi-emsQJvJAAShlR6hM\"",
 "items": [
  {
   "kind": "youtube#videoCategory",
   "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/Xy1mB4_yLrHy_BmKmPBggty2mZQ\"",
   "id": "1",
   "snippet": {
    "channelId": "UCBR8-60-B28hp2BmDPdntcQ",
    "title": "Film & Animation",
    "assignable": true
   }
  },
  {
   "kind": "youtube#videoCategory",
   "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/UZ1oLIIz2dxIhO45ZTFR3a3NyTA\"",
   "id": "2",
   "snippet": {
    "channelId": "UCBR8-60-B28hp2BmDPdntcQ",
    "title": "Autos & Vehicles",
    "assignable": true
   }
  }
 ]
}

Также прилагается функция, которая принимает ввод для поиска и тип поиска и возвращает массив, в котором хранятся требуемые результаты поиска:

function searchFunction(input, searchParameter, region) {
   if (!input) { return []; }

   return videos[region]
      .filter(x => {
         if ((x[searchParameter]).toLowerCase().includes(input.toLowerCase())) {
            return x[searchParameter];
         }
      })
      .map(x => {
         var data = { "title": x.title, "channel_title": x.channel_title, "views": x.views, "likes": x.likes, "dislikes": x.dislikes, "thumbnail_link": x.thumbnail_link };
         return data;
      })
      .reduce((acc, x) => { return acc.reduce((acc, xx) => acc || xx.title == x.title, false) ? acc : [...acc, x]; }, []);
}

Изначально я думал проанализировать список категорий каждого региона и вытащитьtitle оттуда; однако, как нашvideo переменная хранитcategory_id :

// parsing data before it (video & channel title, trending date)
[str, rest] = next(rest);
video.category_id = parseInt(str);
// parsing data after it (like/dislike count, # views/comments, etc.)

нужно ли извлекать данные из данных? Собирался реализовать этот фильтр с раскрывающимся меню на HTML / CSS, фильтровать видео по одной конкретной категории (а не по нескольким).

Обновление (1 мая)

Очень медленно начинаю крафтить решение. Я реализовал список флажков категорий:

<select class="inputclass" name="category" id="category">
    <input type="checkbox" name="Film & Animation" value="1" onchange="">Film & Animation<br>
    <input type="checkbox" name="Autos & Vehicles" value="2" onchange="">Autos & Vehicles<br>
    <input type="checkbox" name="Music" value="10" onchange="">Music<br>
    <input type="checkbox" name="Pets & Animals" value="15" onchange="">Pets & Animals<br>
    <input type="checkbox" name="Sports" value="17" onchange="">Sports<br>
    <input type="checkbox" name="Short Movies" value="18" onchange="">Short Movies<br>
    <input type="checkbox" name="Travel & Events" value="19" onchange="">Travel & Events<br>
    <input type="checkbox" name="Gaming" value="20" onchange="">Gaming<br>
    <input type="checkbox" name="Videoblogging" value="21" onchange="">Videoblogging<br>
    <input type="checkbox" name="People & Blogs" value="22" onchange="">People & Blogs<br>
    <input type="checkbox" name="Comedy" value="23" onchange="">Comedy<br>
    <input type="checkbox" name="Entertainment" value="24" onchange="">Entertainment<br>
    <input type="checkbox" name="News & Politics" value="25" onchange="">News & Politics<br>
    <input type="checkbox" name="Howto & Style" value="26" onchange="">Howto & Style<br>
    <input type="checkbox" name="Education" value="27" onchange="">Education<br>
    <input type="checkbox" name="Science & Technology" value="28" onchange="">Science & Technology<br>
    <input type="checkbox" name="Nonprofits & Activism" value="29" onchange="">Nonprofits & Activism<br>
    <input type="checkbox" name="Movies" value="30" onchange="">Movies<br>
    <input type="checkbox" name="Anime/Animation" value="31" onchange="">Anime/Animation<br>
    <input type="checkbox" name="Action/Adventure" value="32" onchange="">Action/Adventure<br>
    <input type="checkbox" name="Classics" value="33" onchange="">Classics<br>
    <input type="checkbox" name="Documentary" value="35" onchange="">Documentary<br>
    <input type="checkbox" name="Drama" value="36" onchange="">Drama<br>
    <input type="checkbox" name="Family" value="37" onchange="">Family<br>
    <input type="checkbox" name="Foreign" value="38" onchange="">Foreign<br>
    <input type="checkbox" name="Horror" value="39" onchange="">Horror<br>
    <input type="checkbox" name="Sci-Fi/Fantasy" value="40" onchange="">Sci-Fi/Fantasy<br>
    <input type="checkbox" name="Thriller" value="41" onchange="">Thriller<br>
    <input type="checkbox" name="Shorts" value="42" onchange="">Shorts<br>
    <input type="checkbox" name="Shows" value="43" onchange="">Shows<br>
    <input type="checkbox" name="Trailers" value="44" onchange="">Trailers<br>
</select>

Функция должна получить доступvalue в чекбоксе и сравните его сcategory_id вvideos массив с нашими результатами поиска.

Обновление 2 (2 мая)

Небольшое отклонение от первоначального плана реализации. После того, как категории отмечены в списке, нажимается кнопка, которая фильтрует результаты и отображает их на странице.onClick вызовет указанную функцию.

<button class="inputclass" id="filterBtn" onClick="">
   Filter
</button>

Любая помощь будет принята с благодарностью. Большое спасибо и заранее извиняюсь, если это сбивает с толку.

  • 0
    Общее правило: если это не строка, то это не JSON. Здесь вы показываете обычные объекты JavaScript. JSON можно использовать для представления этих объектов или передачи их, например, в ответе API, но сами объекты не являются JSON. Это данные. (Я удалил ссылки JSON из вопроса.)
  • 0
    @Tomalak Спасибо за разъяснения
Теги:
youtube
CodeFix

1 ответ

1
Лучший ответ

У вас есть списокvideo объекты, каждый из которых имеет идентификатор категории и список идентификаторов категорий.

Процесс фильтрации очень прост:

function filterVideosByCategory(videos, categoryIds) {
    return videos.filter(vid => categoryIds.includes(vid.category_id));
}

КогдаcategoryIds представляет собой массив числовых идентификаторов, вам больше ничего не нужно делать, чтобы получить отфильтрованный список.

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

<input type="checkbox" name="category" value="1">Film &amp; Animation<br>
<input type="checkbox" name="category" value="2">Autos &amp; Vehicles<br>
<input type="checkbox" name="category" value="10">Music<br>
<input type="checkbox" name="category" value="15">Pets &amp; Animals<br>
<input type="checkbox" name="category" value="17">Sports<br>
<input type="checkbox" name="category" value="18">Short Movies<br>
<input type="checkbox" name="category" value="19">Travel &amp; Events<br>
<input type="checkbox" name="category" value="20">Gaming<br>
<input type="checkbox" name="category" value="21">Videoblogging<br>
<input type="checkbox" name="category" value="22">People &amp; Blogs<br>
<input type="checkbox" name="category" value="23">Comedy<br>
<input type="checkbox" name="category" value="24">Entertainment<br>
<input type="checkbox" name="category" value="25">News &amp; Politics<br>
<input type="checkbox" name="category" value="26">Howto &amp; Style<br>
<input type="checkbox" name="category" value="27">Education<br>
<input type="checkbox" name="category" value="28">Science &amp; Technology<br>
<input type="checkbox" name="category" value="29">Nonprofits &amp; Activism<br>
<input type="checkbox" name="category" value="30">Movies<br>
<input type="checkbox" name="category" value="31">Anime/Animation<br>
<input type="checkbox" name="category" value="32">Action/Adventure<br>
<input type="checkbox" name="category" value="33">Classics<br>
<input type="checkbox" name="category" value="35">Documentary<br>
<input type="checkbox" name="category" value="36">Drama<br>
<input type="checkbox" name="category" value="37">Family<br>
<input type="checkbox" name="category" value="38">Foreign<br>
<input type="checkbox" name="category" value="39">Horror<br>
<input type="checkbox" name="category" value="40">Sci-Fi/Fantasy<br>
<input type="checkbox" name="category" value="41">Thriller<br>
<input type="checkbox" name="category" value="42">Shorts<br>
<input type="checkbox" name="category" value="43">Shows<br>
<input type="checkbox" name="category" value="44">Trailers<br>

Таким образом, вы можете получить идентификаторы за один раз (я предполагаю, что вы включили jQuery для следующего примера):

$(document).on('click', 'input[name=category]', function () {
    var categoryIds = $('input[name=category]:checked').toArray().map((elem) => +elem.value);

    // work with the IDs...
    console.log(categoryIds);
});

В+ в.map((elem) => +elem.value) - это сокращение, которое превращает значение элемента (которое является строкой в HTML) в число.

Поделиться
Источник
  • 0
    Я использую Node.JS для обработки запросов данных; Я полагаю, что приведенный выше фрагмент кода существенно реализован на сервере js.
  • 0
    @ eb3rt Если вы делаете это на стороне сервера, не обращайте внимания на образец jQuery.
  • 0
    В таком случае, как подобрать идентификаторы на стороне сервера?
  • 0
    @ eb3rt Клиент отправляет содержимое формы, сервер берет идентификаторы из этого сообщения формы. Попробуем не превращать комментарии здесь в HTTP. ускоренный курс. Это не было частью вашего вопроса, есть много хороших руководств и множество примеров по этой теме, и, наконец, что не менее важно, раздел комментариев в любом случае является ужасным форматом для интерактивных лекций.
  • 0
    Относительно «не входил в ваш вопрос»: Stack Overflow - это формат «вопрос и ответ». Вы обновили свой вопрос дважды, и каждый раз он получил новый ответ. Это не так, как должно работать. Один вопрос, один ответ. Есть еще вопрос? Напишите новый пост. Но мне кажется, что вам сейчас не хватает многих основ, и что вы сами еще не уверены, как вы вообще хотите реализовать свою идею. Я рекомендую вам сделать шаг назад и сначала проработать пару руководств, которые дадут вам представление о том, как работают HTML-формы, как работает HTTP и как все это интегрируется с node.js.

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

  • Состояние редактирования внутри модального окна1 ответ

    Я делаю небольшое приложение для заметок. Когда пользователь пишет свой заголовок и заметку и нажимает «Отправить», заметка помещается на страницу ... Я хочу иметь возможность редактировать заметку. При нажатии кнопки редактирования появляется модальное окно, и я хочу, чтобы заголовок и примечание п...

  • Выберите элемент, необходимый в vuejs, не работает1 ответ

    Я новичок в vuejs. Я хочу сделать элемент выбора из раскрывающегося списка обязательным, я попытался добавить требуемый атрибут, как в приведенном ниже коде. <v-select :items="fournisseursByClient" ...

  • Функция клавиатуры работает только один раз для первой буквы ввода2 ответ

    У меня есть текстовый ввод, где пользователь вводит желаемое имя страницы<input type='text' id='pageName' name='PageName' class='form-control pageName'> Я пытаюсь использовать функцию keyup для запуска Ajax, чтобы проверить, существует ли страница, однако при вводе чего-то вродеindex Ajax от...

  • как добавить ссылки на липкую панель навигации1 ответ

    Я попытался добавить фоновое изображение для своего веб-сайта django, и это вообще не сработало. Я использую этот ответ из stackoverflow, а также ссылку на вопрос stackoverflow. Но это не сработало. А также я переношу изменения в базу данных. добавить фоновое изображение как в методе cssbackground-i...

  • Как заблокировать меню боковой панели, скрытое при обновлении страницы1 ответ

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

  • Если, то Заявления в распознавании речи HTML [закрыто]1 ответ

    Закрыто. Этот вопрос требует подробностей отладки . В настоящее время он не принимает ответы. Хотите улучшить этот вопрос? Обновите вопрос, чтобы он соответствовал теме Stack Overflow. Закрыт в прошлом месяце . Уточните этот вопрос Итак, я пытаюсь сделать голосового помощника html, и я борюсь с оп...

  • Калькулятор JS форм1 ответ

    Я сделал этот простой калькулятор своим первым проектом на JS. Я был на одном курсе, где мне сказали, что программисты «ленивы», поэтому они стараются писать как можно меньше кода. И вот мой вопрос. Я думаю, что мой калькулятор действительно долго работает над кодом. Я хотел бы знать, есть ли способ...

  • Как создать html-страницу со ссылкой [закрыто]1 ответ

    Закрыто . Этот вопрос должен быть более конкретным . В настоящее время он не принимает ответы. Хотите улучшить этот вопрос? Обновите вопрос, чтобы он фокусировался только на одной проблеме, отредактировав этот пост . Закрыт в прошлом месяце . Уточните этот вопрос Как разместить видео ключи на моем...

  • Как добавить проверку ввода в React?2 ответ

    У меня простая форма, в которойfirstName а такжеlastName . <label htmlFor="firstName">First Name: </label> <input type="text" className="form-control" id="firstName" name="firstName" value={basicDet...

  • Как использовать javascript api при защите ключа api? [дубликат]2 ответ

    На этот вопрос уже есть ответ : Как использовать внешние токены доступа api, не открывая их пользователю? (1 ответ) Закрыт в прошлом месяце . Новичок здесь. У меня есть приложение, которое использует Here's Geocoding REST API через node.js (w / express). (Мой ключ api находится на стороне серве...

CodeFix
Цитата дня

"Завидую тестировщикам: все хотят с ними дружить."

Эндрю Таненбаум