您如何按 id 和喜欢对评论和子评论对象数组进行排序?



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

每个注释都有其自己的唯一 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"
}
}, {...

我正在尝试将排序后的注释存储在名为"注释"的对象中。每一代评论和子评论都根据"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", 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; }

最后,我在数据库查询中添加了一个"按喜欢排序"参数,然后我使用 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);
}
});
}

最新更新