JS实现人员数组与博客数组匹配并添加关联博客的方法
解决方案
问题原因
你之前的代码只保留最后一个匹配项,核心问题是每次找到关联博客时直接覆盖related_posts数组,而非向数组中追加元素,或是在循环的错误位置初始化该数组,导致每次循环都重置为空。
优化实现方案
针对大型数组,推荐先构建博客的作者映射表,将时间复杂度从O(n*m)降至O(n+m),大幅提升性能:
步骤1:构建博客作者映射
遍历博客数组,创建一个以作者名为键、对应博客数组为值的对象,后续查找人员关联博客时无需重复遍历整个博客数组。
步骤2:给人员数组添加关联博客
遍历人员数组,从映射表中取出当前人员对应的博客列表,赋值给custom.related_posts(无关联博客则设为空数组)。
完整代码
// 1. 构建博客作者映射表 const authorPostsMap = arr2.reduce((map, post) => { // 取出博客的作者名称(假设每个博客至少有一个作者) const authorName = post.custom.author[0].identifier; // 已有该作者则追加博客,否则新建数组存储 map[authorName] ? map[authorName].push(post) : map[authorName] = [post]; return map; }, {}); // 2. 遍历人员数组,添加关联博客 arr1.forEach(person => { person.custom.related_posts = authorPostsMap[person.post_title] || []; });
双重循环写法(不推荐用于大型数组)
如果不想用映射表,只需修正循环逻辑:在遍历人员时先初始化空数组,遍历博客时向数组追加匹配项,而非覆盖:
arr1.forEach(person => { // 每个人员仅初始化一次空数组 person.custom.related_posts = []; arr2.forEach(post => { const authorName = post.custom.author[0].identifier; if (authorName === person.post_title) { // 用push追加元素,避免覆盖 person.custom.related_posts.push(post); } }); });
补充说明
- 映射表方案更适合大型数组,避免了嵌套循环的重复遍历,性能优势显著。
- 代码默认每个博客的
author数组至少有一个元素,且identifier为准确作者名;若存在多作者场景,可调整映射表逻辑,遍历每个作者并关联当前博客。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

