You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用filter()从ID列表中批量查找多个条目?

filter()优化批量条目查找的实现

嘿,这个场景我太熟了!你原来的forEach+find写法确实会重复遍历数据源,效率上有点浪费——尤其是当idList或者DATASOURCE规模变大的时候。用filter()来实现不仅代码更简洁,性能也会提升不少,我给你一步步拆解:

基础实现:filter() + includes()

最直接的写法就是用filter()遍历一次DATASOURCE,筛选出ididList中的条目:

findItems(idList: string[]) {
  return DATASOURCE.filter(item => idList.includes(item.id));
}

这个逻辑很清晰:filter()会逐个检查DATASOURCE里的每一项,只要该项的id存在于idList中,就会被保留到结果数组里。相比你原来的写法,它只需要遍历DATASOURCE一次,而不是idList.length次,时间复杂度从O(m*n)降到了O(m+n)mDATASOURCE的长度,nidList的长度)。

性能升级:用Set优化查找速度

如果你的idList很长,idList.includes()每次查找的时间是O(n),可以把idList转换成Set,利用Set.has()O(1)查找性能进一步优化:

findItems(idList: string[]) {
  const idSet = new Set(idList);
  return DATASOURCE.filter(item => idSet.has(item.id));
}

先把idList转成Set,之后每次判断item.id是否存在的操作都会快很多,数据量越大,这个优化的效果越明显。

特殊需求:保留原数组的结构(包括undefined

这里要提个小差异:你原来的函数如果遇到idList里不存在的id,会在结果数组里插入undefined;而上面的filter写法只会返回实际存在的条目。如果需要严格保持原idList的顺序和长度(哪怕某些id找不到),可以用Map配合map()来实现:

findItems(idList: string[]) {
  // 先把数据源转成id -> 条目的映射
  const itemMap = new Map(DATASOURCE.map(item => [item.id, item]));
  // 遍历idList,按顺序取出对应条目(找不到就是undefined)
  return idList.map(id => itemMap.get(id));
}

这个写法同样只遍历DATASOURCE一次,之后的查找都是O(1),既保留了原函数的行为,又比原来的forEach+find高效得多。

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

火山引擎 最新活动