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

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

Это код:

Гэтсби-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.

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

Любая подсказка?

Спасибо.

1 Ответ

0 голосов
/ 05 января 2019
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.log(categoryWiseArticleCount);
// {
//   category_1: 7,
//   category_2: 10,
// }
...