【问题标题】:How do you sort an Array of Comments and Sub-comment Objects by id and likes?如何按 id 和 likes 对一组评论和子评论对象进行排序?
【发布时间】:2020-05-04 10:32:39
【问题描述】:

我在一个论坛上工作,在检索到帖子的所有 cmets 后,我试图将它们分类为 cmets 和子 cmets。

每条评论都有自己的唯一 ID 以及其父级的 ID。如果评论是直接在帖子上发表的(即顶级评论),则父 ID 等于论坛帖子 ID。

"doc": [{
        "id": "73emgNKLiCdzcREyCLtg",
        "data": {
                  "likeCount": 0,
                  "body": "comment text",
                  "createdAt": "2020-01-16T21:42:37.782Z",
                  "forumPostId": "csRvt21qDqSeLqXv3mAr",        //forumPostID is same as ParentId
                  "parentId": "csRvt21qDqSeLqXv3mAr"
                }
        }, {
        "id": "2sRvt21qDqSeLqXv3mAr",
        "data": {
                  "likeCount": 0,
                  "body": "subcomment text",
                  "createdAt": "2020-01-16T21:42:37.782Z",
                  "forumPostId": "csRvt21qDqSeLqXv3mAr",
                  "parentId": "73emgNKLiCdzcREyCLtg"
                }
        }, {
        "id": "1242sR1qDqSeLqXv3mAr",
        "data": {
                  "likeCount": 1,
                  "body": "subcomment text",
                  "createdAt": "2020-01-16T21:42:37.782Z",
                  "forumPostId": "csRvt21qDqSeLqXv3mAr",       //forumPostID is same as ParentId
                  "parentId": "csRvt21qDqSeLqXv3mAr"
                }
        }, {...

我试图将排序后的 cmets 存储在一个名为“cmets”的对象中。每一代的cmets和子cmets都是按照“likeCount”和“CreatedAt”排序的,每条评论都包含了它所有的子cmets。最终结果如下所示:

"comments": [{
            "id": "1242sR1qDqSeLqXv3mAr",
            "data": {
                      "likeCount": 1,                          //comment with most likes moved to top
                      "body": "subcomment text",
                      "createdAt": "2020-01-16T21:42:37.782Z",
                      "forumPostId": "csRvt21qDqSeLqXv3mAr",
                      "parentId": "csRvt21qDqSeLqXv3mAr"
                    },
            "comments": {}
            }, {
            "id": "73emgNKLiCdzcREyCLtg",
            "data": {
                      "likeCount": 0,
                      "body": "comment text",
                      "createdAt": "2020-01-16T21:42:37.782Z",
                      "forumPostId": "csRvt21qDqSeLqXv3mAr",
                      "parentId": "csRvt21qDqSeLqXv3mAr"
                    },
            "comments": {
                      "id": "2sRvt21qDqSeLqXv3mAr",
                      "data": {
                                "likeCount": 0,
                                "body": "subcomment text",
                                "createdAt": "2020-01-16T21:42:37.782Z",
                                "forumPostId": "csRvt21qDqSeLqXv3mAr",
                                "parentId": "73emgNKLiCdzcREyCLtg"
                              }
                      }
            }, {...

*注意子cmets可以有子cmets(即可以无限代)

我一直在阅读有关 find()、filter() 和 sort() 的内容,但无法完全理解完成此任务的函数/循环会是什么样子。

我们将不胜感激任何和所有的帮助/指导!

【问题讨论】:

  • 到目前为止你尝试过什么?为什么要在客户端而不是服务器上执行此操作?
  • 我想你的意思是comments 应该是一个评论对象数组,而不是一个对象本身,对吧?
  • 我猜您将数据保存在数据库中,如果您更改查询并从那里获得所需的数据结构会不会更好?
  • @Andreas 很抱歉有任何混淆,我正在做这个服务器端。排序后的对象将被转发给客户端
  • @AmitB。正确

标签: javascript arrays node.js sorting filter


【解决方案1】:

让我感到困扰的是,您可能会花费大量时间来尝试解决问题,来这里寻求指导,然后有人可能会花 2 秒钟时间对您的帖子投反对票,而没有明显的原因。话虽如此,谢谢 Nina、Andres、Amit 和 Arootin。您的所有建议都为我指明了正确的方向!

最后,我在数据库查询中添加了一个“order by likes”参数,然后我使用 forEach 循环循环遍历所有原始评论数据,并将带有 PrentIds = 的 cmets 推送到评论问题的 ID 到其评论数组。这不是世界上最漂亮的函数,但结果如下:

.
.
.
.then((data) => {
      forumPostData.comments = [];
      buildComments(forumPostData, data);
      return res.json(forumPostData);
    })
.
.
.

      function buildComments(object, data) {
          data.forEach((doc) => {
            if (doc.data().parentId === object.id) {
              let comm = {
                id: doc.id,
                data: doc.data(),
                comments: []
              };
              object.comments.push(comm);
              let index = object.comments.findIndex(x => x.id === doc.id);
              buildComments(object.comments[index], data);
            }
          });
      }

【讨论】:

    【解决方案2】:

    您可以将项目收集为树并对项目进行排序。

    var data = [{ id: "73emgNKLiCdzcREyCLtg", data: { likeCount: 0, body: "comment text", createdAt: "2020-01-16T21:42:37.782Z", forumPostId: "csRvt21qDqSeLqXv3mAr", parentId: "csRvt21qDqSeLqXv3mAr" } }, { id: "2sRvt21qDqSeLqXv3mAr", data: { likeCount: 0, body: "subcomment text", createdAt: "2020-01-16T21:42:37.782Z", forumPostId: "csRvt21qDqSeLqXv3mAr", parentId: "73emgNKLiCdzcREyCLtg" } }, { id: "1242sR1qDqSeLqXv3mAr", data: { likeCount: 1, body: "subcomment text", createdAt: "2020-01-16T21:42:37.782Z", forumPostId: "csRvt21qDqSeLqXv3mAr", parentId: "csRvt21qDqSeLqXv3mAr" } }],
        tree = function (data, root) {
            var t = {};
            data.forEach(o => {
                Object.assign(t[o.id] = t[o.id] || {}, o);
                t[o.data.parentId] = t[o.data.parentId] || {};
                t[o.data.parentId].children = t[o.data.parentId].children || [];
                t[o.data.parentId].children.push(t[o.id]);
                t[o.data.parentId].children.sort((a, b) => b.data.likeCount - a.data.likeCount);
            });
            return t[root].children;
        }(data, data[0].data.forumPostId);
    
    console.log(tree);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多