Как отфильтровать статьи по категориям, чтобы узнать точное количество страниц для пагинации (JS)

На моих веб-сайтах Gatsby JS я распределил статьи по категориям, и мне удалось создать страницу для каждой категории и разбить каждую страницу на страницы на основе максимального количества статей, которые должны отображаться на странице. Проблема в том, что вместо того, чтобы рассчитывать точное количество существующих страниц по категории, мой код вычисляет общее количество существующих страниц (на основе всех статей, а не статей по категориям).

Это код:

gatsby-node.js

let categories = []
 _.each(result.data.allMarkdownRemark.edges, edge => {
     if (_.get(edge, "node.frontmatter.categories")) {
        categories = categories.concat(edge.node.frontmatter.categories)
        }
    })

    const categoryarticles = categories.filter(category =>{
        return category === category
    })

    const categoryarticlesPerPage = 6
    const numPages = Math.ceil(categoryarticles.length / categoryarticlesPerPage)

    //Creating a PAGINATED page for each category, so that any category page will only display a certain amount of articles (defined in categoryarticlesPerPage)
    Array.from({ length: numPages }).forEach((el, i) => {
        categories.forEach(category => {
            createPage({
                path: i === 0 ? `/${_.kebabCase(category)}` : `/${_.kebabCase(category)}/${i + 1}`,
                component: categoryTemplate,
                context: {
                    category,
                    limit: categoryarticlesPerPage,
                    skip: i * categoryarticlesPerPage,
                    numPages,
                   currentPage: i + 1,
                },
          })
      })
 })

Ошибка, несомненно, в статье категории const.

Желаемый результат - вычислить количество статей по категориям, чтобы разбивка по категориям начала работать должным образом (прямо сейчас создается больше страниц, чем необходимо, поскольку учитывается все количество статей, представленных на веб-сайте).

Есть подсказка?

Спасибо.

Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
70
1

Ответы 1

const categoryarticles = categories.filter(category =>{
  return category === category
})

всегда возвращает весь массив, поскольку category === category всегда является true. Одна из этих переменных category должна быть другой. Наверное, нужно фильтровать по articles.

Кроме того, это похоже на идеальную работу для _.flatMap, например:

const categories = _.flatMap(result.data.allMarkdownRemark.edges, edge => {
  return _.get(edge, "node.frontmatter.categories", []);
});

// get articles from somewhere
const categoryarticles = articles.filter(category => {
  return article.category === category;
});

Если вы хотите подсчитать количество статей в каждой категории, вы можете использовать _.countBy следующим образом:

const categoryWiseArticleCount = _.countBy(articles, article => {
  // return the article category here
  return article.category;
});

console.info(categoryWiseArticleCount);
// {
//   category_1: 7,
//   category_2: 10,
// }

Привет, спасибо за помощь! Итак, я пробовал следующее: const article = result.data.allMarkdownRemark.edges const categoryarticles = article.filter (category => {return article.categories === category}), и в нем говорится, что статья не определена. (Обратите внимание, что в return article.categories категории во множественном числе не являются ошибкой, это атрибут в файлах уценки). Что мне не хватает?

Giulia 05.01.2019 15:20

Переменная article - здесь не определена. Откуда ты это взял? Раньше я не пользовался Gatsby и поэтому точно не знаю, как получить article.

Faizuddin Mohammed 05.01.2019 15:21

Я знаю только, как определять статьи, но понятия не имею, как определять отдельную статью. Есть ли другой способ добиться результата?

Giulia 05.01.2019 15:33

Если мне так нравится: const categoryarticles = result.data.allMarkdownRemark.edges.filter(edge => edge.node.frontmatter.categories === 'management') вроде работает. Он берет все статьи категории «менеджмент» и по этому номеру начинает работать пагинация. Как я могу использовать переменную категории вместо жестко запрограммированной, чтобы она настраивалась для каждой категории массива категорий?

Giulia 05.01.2019 16:03

Я обновил ответ, чтобы сделать это. Взгляни, пожалуйста.

Faizuddin Mohammed 05.01.2019 16:03

Хорошо, давай начнем чат, пожалуйста.

Faizuddin Mohammed 05.01.2019 16:34

Позвольте нам продолжить обсуждение в чате.

Giulia 05.01.2019 16:42

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