将项目列表排序为不同的类别

时间:2015-05-12 13:03:00

标签: mongodb meteor

想象一个网站列出了不同的文章与不同的主题,您作为用户可以标记您喜欢的文章以便稍后阅读。收藏的文章会保存并显示在本网站的个人小空间中,如下所示:

  • 即将到来的夏季大片
  • 超级英雄永远不会结束吗?
  • romcoms死了吗?

科学

  • Bezos或Musk,谁会先到达火星?

哲学

  • 如果我们的眼睛不真实,镜子怎么才能真实?

Etc等。

我已使用以下字段保存数据库中的每篇文章:

{
  articleName: "Upcoming summer blockbusters",
  subject: "Movies",
  link: //link to the article
}

然后,当用户收藏一个时,我只需将其复制到数据库中的自己的集合中。

然后是问题......

我可以遍历他的文章并在他的用户页面上打印出来,如下所示:

<ul>
  {{#each articles}}
    <heading>{{subject}}</heading> //how do I avoid duplicates?
    <li>{{articleName}}</li>
  {{/each}}
</ul>

但是,这会复制多篇文章共享的主题。

我只能遍历主题(例如,将它们变成一个检查重复项的数组)并打印出来:

<ul>
  {{#each subjects}}
    <heading>{{this}}</heading>
    <li>{{../articleName}}</li> //how do I print the correct one?
  {{/each}}
</ul>

但这种方式会被完全打破,因为文章不会出现在正确的主题标题下......

我该怎么办?

1 个答案:

答案 0 :(得分:1)

实际上我认为你应该只存储喜欢的文章,就像那样。处理文章删除等案例会更简单。只需在辅助函数中解析文章,您就会得到相同的结果:

favArticlesBySubjects: function () {
    var favArticles = Meteor.user().profile.favArticles;

    var articlesBySubject = [];
    favArticles.forEach(function (article) {
      var index = _.findIndex(articlesBySubject, function (obj) {
          return obj.subject === article.subject;
      });
      if (index < 0)
        articlesBySubject.push({subject: article.subject, articles:[article]});
      else
        articlesBySubject[index].articles.push(article);
    };
    return articlesBySubject;
}

这样,您可以使用以下方式显示您喜欢的文章:

{{#each favArticlesBySubjects}}
  <heading>{{subject}}</heading>
  <ul>
  {{#each articles}}
    <li>{{articleName}}</li>
  {{/each}}
  </ul>
{{/each}}