如何用另一对象数组过滤对象数组?能否单次迭代实现?
优化方案:单次迭代完成过滤与转换
可以通过预处理过滤器+单次遍历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
相关产品推荐
相关产品推荐

