插件窝 干货文章 如何用JavaScript高效筛选和合并聊天记录中特定问题的全部回复?

如何用JavaScript高效筛选和合并聊天记录中特定问题的全部回复?

回复 parentId 递归 所有 401    来源:    2025-03-21

在JavaScript中,高效筛选和合并聊天记录中特定问题的全部回复可以通过以下步骤实现:

  1. 数据结构:假设每条聊天记录是一个对象,包含message(消息内容)、isReply(是否是回复)、parentId(如果是回复,指向被回复的消息ID)等字段。

  2. 筛选特定问题的回复:首先找到特定问题的消息,然后根据parentId筛选出所有直接回复该问题的消息。

  3. 递归查找所有回复:对于每条直接回复,递归查找其所有子回复,直到没有更多回复为止。

  4. 合并回复:将所有找到的回复合并到一个数组中。

以下是一个示例代码:

// 示例聊天记录数据
const chatRecords = [
    { id: 1, message: "问题1", isReply: false, parentId: null },
    { id: 2, message: "回复1", isReply: true, parentId: 1 },
    { id: 3, message: "回复2", isReply: true, parentId: 1 },
    { id: 4, message: "回复1的子回复", isReply: true, parentId: 2 },
    { id: 5, message: "问题2", isReply: false, parentId: null },
    { id: 6, message: "回复3", isReply: true, parentId: 5 },
];

// 查找特定问题的所有回复
function findReplies(records, questionId) {
    const replies = [];

    // 递归查找所有回复
    function findRepliesRecursive(parentId) {
        records.forEach(record => {
            if (record.parentId === parentId) {
                replies.push(record);
                findRepliesRecursive(record.id); // 递归查找子回复
            }
        });
    }

    // 开始查找
    findRepliesRecursive(questionId);
    return replies;
}

// 示例:查找问题1的所有回复
const questionId = 1;
const allReplies = findReplies(chatRecords, questionId);

console.log(allReplies);

代码解释:

  1. chatRecords:这是一个包含所有聊天记录的数组,每条记录是一个对象。
  2. findReplies:这个函数接受聊天记录数组和特定问题的ID作为参数,返回该问题的所有回复。
  3. findRepliesRecursive:这是一个递归函数,用于查找特定问题的所有直接和间接回复。
  4. replies:这是一个数组,用于存储找到的所有回复。

输出:

[
    { id: 2, message: "回复1", isReply: true, parentId: 1 },
    { id: 4, message: "回复1的子回复", isReply: true, parentId: 2 },
    { id: 3, message: "回复2", isReply: true, parentId: 1 }
]

优化建议:

  • 时间复杂度:如果聊天记录数量很大,可以考虑使用MapSet来优化查找效率。
  • 并行处理:如果数据量非常大,可以考虑使用Web Workers进行并行处理。

通过这种方式,你可以高效地筛选和合并聊天记录中特定问题的全部回复。