如何按类别过滤文章以查找分页(JS)的确切页面数

时间:2019-01-05 13:44:39

标签: javascript filter pagination gatsby

在我的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类别的文章中。

理想的结果是按类别计算文章数量,以便类别分页开始正常工作(现在,由于考虑了网站上的全部文章数量,因此它创建了不必要的页面)。 / p>

有任何线索吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

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,
// }