You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:10:29