我有很多有线程的评论。假设评论如下:
{
_id: [ObjectID],
parentid: [ObjectID],
...
}
我从db中检索了所有注释的大量数组:
comments = [comment1, comment2, comment3]
要获得任意评论的回复,我有一个这样的帮助函数:
function getReplies(comment, replies) {
return replies.filter(function(reply) {
return reply.parentid === comment._id
}
}
然而,我感到不安的是,这个getReplies
函数总是在已经处理了很多注释时检查整个数组(每个注释只有一个父项)或注释只有1个回复或根本没有回复(更深入的评论主题)。
这是过度优化,但我想知道你们如何解决这个问题。除非有更优雅的解决方案,否则我认为我不会改变这个功能。你将如何构建这个帮助器,以便它不会不必要地两次处理相同的注释?
答案 0 :(得分:1)
我会处理整个评论列表一次,以便从comment._id到回复列表构建一个查找表。假设comment._id有一个合理的toString()表示,那么这应该起作用:
var commentIdToReplies = {};
comments.forEach(function(comment) {
if (comment.parentid) {
var replies = commentIdToReplies[comment.parentid];
if (!replies) {
replies = [];
commentIdToReplies[comment.parentid] = replies;
}
// Or just the _id if desired
replies.push(comment);
}
});
// now you can get the replies using:
// commentIdToReplies[comment._id]
如果从commentIdToReplies返回undefined,则表示该评论没有回复。
这种方法通过使用更多内存来维护查找表来缩短每次扫描整个列表的时间。