[英]Remove items in an array as they are matched
我有大量的線程注釋。 假設注釋如下所示:
{
_id: [ObjectID],
parentid: [ObjectID],
...
}
我從數據庫中檢索到的所有注釋都有一個大數組:
comments = [comment1, comment2, comment3]
要獲得任何任意評論的答復,我有一個像這樣的輔助函數:
function getReplies(comment, replies) {
return replies.filter(function(reply) {
return reply.parentid === comment._id
}
}
但是,令我感到getReplies
的是,當已經處理了許多注釋(每個注釋只有一個父對象)或者注釋只有1個答復或根本沒有答復(在注釋線程中更深)時,此getReplies
函數將始終檢查整個數組。
這是過度優化,但是我想知道你們將如何解決這個問題。 我認為除非有更優雅的解決方案,否則我不會更改此功能。 您將如何構造該幫助程序,以免不必要地兩次處理同一評論?
我將處理整個評論列表一次,以建立從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返回未定義,則表示該評論沒有回復。
這種方法權衡了每次必須掃描整個列表的時間以及使用更多內存來維護查找表的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.