Javascript 如何按id和like对注释和子注释对象数组进行排序?

Javascript 如何按id和like对注释和子注释对象数组进行排序?,javascript,arrays,node.js,sorting,filter,Javascript,Arrays,Node.js,Sorting,Filter,我在一个论坛上工作,在检索完一篇帖子的所有评论后,我试图将它们分为评论和子评论 每个注释都有自己唯一的ID以及其父注释的ID。如果直接在帖子上发表评论(即顶级评论),则家长ID等于论坛帖子ID "doc": [{ "id": "73emgNKLiCdzcREyCLtg", "data": { "likeCount": 0, "body": "comment text",

我在一个论坛上工作,在检索完一篇帖子的所有评论后,我试图将它们分为评论和子评论

每个注释都有自己唯一的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"
                }
        }, {...
我试图将排序后的注释存储在一个名为“comments”的对象中。每一代注释和子注释都基于“likeCount”和“CreatedAt”进行排序,并且每个注释都包含其所有子注释。最终结果如下所示:

"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"
                              }
                      }
            }, {...
*注意,子注释可以有子注释(即可以无限代)

我一直在阅读find()、filter()和sort()的相关内容,但我不能完全理解实现这一点的函数/循环是什么样子的


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

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

var data=[{id:“73emgNKLiCdzcREyCLtg”,数据:{likeCount:0,body:“comment text”,createdAt:“2020-01-16T21:42:37.782Z”,forumPostId:“csrvt21qdqselqv3mar”,parentId:“csrvt21qdqselqv3mar”},数据:{likeCount:0,body:“subcent text”,createdAt:“2020-01-16T21:42:37.782Z”,forumpId:“csRvt21qDqSeLqXv3mAr”,parentId:“73emgNKLiCdzcREyCLtg”},{id:“1242sR1qDqSeLqXv3mAr”,数据:{likeCount:1,body:“subcomment text”,createdAt:“2020-01-16T21:42:37.782Z”,forumPostId:“csrvt21qdelqselqxv3mar”,parentId:“csrvt21qdelqselxv3mar”},
树=函数(数据,根){
var t={};
data.forEach(o=>{
赋值(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);
});
返回t[root]。子对象;
}(数据,数据[0].data.forumPostId);
console.log(树);

.as控制台包装{最大高度:100%!重要;顶部:0;}
你可以花很多时间来想办法,来这里寻求指导,有人可以花2秒钟的时间毫无理由地否决你的帖子。尽管如此,谢谢尼娜、安德烈斯、阿米特和阿罗廷。你所有的建议都给了我正确的方向

最后,我在数据库查询中添加了一个“order by likes”参数,然后我使用forEach循环遍历所有原始注释数据,并将带有PrentIds=的注释推送到相关注释的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);
            }
          });
      }

到目前为止,您尝试了什么?为什么要在客户端而不是服务器上执行此操作?我认为您的意思是
注释
应该是注释对象的数组,而不是对象本身,对吗?我猜您正在将数据保存在数据库中,如果您更改查询并从中获得所需的数据结构,不是更好吗?@AndreaIt’很抱歉造成混淆,我正在服务器端执行此操作。已排序的对象将转发到client@AmitB.对的