如何通过遍历多对象数组为subjects填充name_id数组
解决方案
核心思路
先通过一次遍历构建「主题code -> 关联书籍id列表」的映射表,再用这个映射表批量更新subjects的name_id字段,避免嵌套循环带来的性能损耗,适配大数据量场景。
代码实现
// 1. 构建code到书籍id的映射表,用Map提升查找效率 const codeToBookIds = new Map(); books.forEach(book => { const bookId = book.id; book.set_no.forEach(code => { // 如果该code已有记录,就追加bookId;没有则初始化数组 if (codeToBookIds.has(code)) { codeToBookIds.get(code).push(bookId); } else { codeToBookIds.set(code, [bookId]); } }); }); // 2. 批量更新subjects的name_id字段 subjects.forEach(subject => { // 从映射表取对应书籍id列表,没有则设为空数组 subject.name_id = codeToBookIds.get(subject.code) || []; });
关键说明
- 性能优化:原本嵌套循环的时间复杂度是
O(书籍总数 × 单本书set_no长度 + 主题总数),用Map后时间复杂度降为O(总set_no元素数量 + 主题总数),在1.5万甚至4.5万条数据下依然高效。 - 类型匹配:确保
set_no中的元素和subject.code类型一致(示例中均为字符串),避免查找失败。 - 边界处理:如果某个主题的code未出现在任何书籍的
set_no中,name_id会被设为空数组,不影响后续下拉筛选逻辑。
内容的提问来源于stack exchange,提问作者TCGPlaza
相关产品推荐
相关产品推荐

