0

スレッド化されたコメントがたくさんあります。コメントが次のようになっているとします。

{
  _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つしかない場合)、またはコメントに応答が1つしかない場合、またはまったくない場合(コメントスレッドの奥深く)に、この関数が常に配列全体をチェックするという事実に不安を感じています。

これは過度に最適化されていますが、皆さんがこの問題をどのように解決するかを知りたいと思います。もっと洗練された解決策がない限り、この機能を変更することはないと思います。同じコメントを不必要に2回処理しないように、このヘルパーをどのように構成しますか?

4

1 に答える 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から返された場合、そのコメントに対する応答がなかったことを意味します。

このアプローチは、ルックアップテーブルを維持するためにより多くのメモリを使用することで、毎回リスト全体をスキャンしなければならない時間とトレードオフになります。

于 2012-10-04T20:32:15.240 に答える