0

我有大量的评论。假设评论看起来像这样:

{
  _id: [ObjectID],
  parentid: [ObjectID],
  ...
}

我有一个从数据库中检索到的所有评论的大型数组:

comments = [comment1, comment2, comment3]

为了得到任意评论的回复,我有一个这样的辅助函数:

function getReplies(comment, replies) {
  return replies.filter(function(reply) {
    return reply.parentid === comment._id
  }
}

getReplies然而,当许多评论已经被处理(每个只有一个父)或评论只有 1 个回复或根本没有回复(在评论线程中更深)时,这个函数将始终检查整个数组,这让我感到不安。

这是过度优化,但我想知道你们将如何解决这个问题。除非有更优雅的解决方案,否则我认为我不会更改此功能。您将如何构建此帮助程序,以便它不会不必要地处理相同的评论两次?

4

1 回答 1

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,则意味着该评论没有回复。

这种方法在每次都必须扫描整个列表的时间与使用更多内存来维护查找表之间进行权衡。

于 2012-10-04T20:32:15.240 回答