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

如何用另一对象数组过滤对象数组?能否单次迭代实现?

优化方案:单次迭代完成过滤与转换

可以通过预处理过滤器+单次遍历entries的方式实现需求,同时解决原代码的两个问题:避免多次遍历entries,以及保留topics为空的过滤器对应的条目。

步骤1:预处理过滤器,提升查找效率

先将filters转换为Map结构,键为条目ID,值为该条目允许的topic ID集合(用Set实现O(1)查找):

const filterMap = new Map();
filters.forEach(filter => {
  // 将当前filter的topic id存入Set
  const allowedTopicIds = new Set(filter.topics.map(topic => topic.id));
  filterMap.set(filter.id, allowedTopicIds);
});

步骤2:单次遍历entries完成过滤与转换

使用reduce方法遍历一次entries数组,同时完成条目筛选和topics过滤:

const result = entries.reduce((acc, entry) => {
  // 获取当前条目对应的过滤器规则
  const allowedTopicIds = filterMap.get(entry.id);
  
  // 如果没有匹配的过滤器,跳过该条目
  if (!allowedTopicIds) return acc;

  let processedTopics;
  if (allowedTopicIds.size === 0) {
    // 过滤器topics为空时,保留原条目所有topics
    processedTopics = entry.topics;
  } else {
    // 过滤器有指定topics时,过滤出符合条件的topics
    processedTopics = entry.topics.filter(topic => allowedTopicIds.has(topic.id));
  }

  // 将处理后的条目加入结果数组
  acc.push({
    ...entry,
    topics: processedTopics
  });

  return acc;
}, []);

console.log(result);

方案优势

  • 单次迭代entries:仅用reduce遍历一次entries数组,同时完成筛选和转换,避免原代码中filter+map的两次遍历
  • 高效查找:通过Map和Set将过滤器的查找复杂度从O(n)降为O(1),整体性能更优
  • 保留topics为空的条目:针对过滤器中topics为空的情况,直接保留原条目所有topics,不再过滤该条目

内容的提问来源于stack exchange,提问作者Croviajo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:57:29