JavaScript中查找对象数组目标项并合并的高效实现方案
可以先将作答记录数组转换为以questionId为键的哈希结构(Map或普通对象),仅需一次遍历就可以完成索引构建,后续查找对应题目的作答记录仅需常数时间,整体时间复杂度从原来的O(n*m)优化为O(n+m),数据量越大性能提升越明显。
实现代码
基于 Map 实现(推荐)
// 预构建questionId到作答记录的映射,仅遍历一次response数组 const responseMap = new Map(response.map(item => [item.questionId, item])) const merged = questionDetail.map(questionDetailItem => { const { questionId } = questionDetailItem.question return { question: questionDetailItem.question, choices: questionDetailItem.choices, response: responseMap.get(questionId) } })
基于普通对象实现(兼容低版本环境)
const responseMap = {} response.forEach(item => { responseMap[item.questionId] = item }) const merged = questionDetail.map(questionDetailItem => { const { questionId } = questionDetailItem.question return { question: questionDetailItem.question, choices: questionDetailItem.choices, response: responseMap[questionId] } })
说明
如果存在同一道题对应多条作答记录的场景,可自行调整映射构建逻辑,将映射的值改为存储对应questionId的作答记录数组即可,返回的结果结构和你原本的实现完全兼容。
内容的提问来源于stack exchange,提问作者Moon
相关产品推荐
相关产品推荐

