我正试图通过基于id
s列表的id
属性获取多个项。要给出一个示例,请使用下面的函数。
findItems(idList: string[]){
let fetchedItems: SomeType[] = [];
idList.forEach(a=>{
fetchedItems.push(DATASOURCE.find(b=> b.id === a));
}
return fetchedItems;
}
正如您所看到的,此函数获取string
的列表,并使用forEach()
方法单独查找每个项目,并将其推送到fetchedItems
数组,这意味着如果该列表中有10个项目,则将有10个对同一数据库的连续调用。
进一步探究这种好奇心,我突然想到filter()
正是为了做这件事而设计的。我看了MDN上的文档,在谷歌上搜索了一下,但我想我不知道该专门搜索什么才能得到我需要研究的结果。有人能告诉我怎么做吗?
将idList
变成Set
(为了降低计算复杂度(,然后可以通过id
是否包含在集合中来在DATASOURCE
上进行.filter
:
findItems(idList: string[]){
const ids = new Set(idList);
return DATASOURCE.filter(({ id }) => ids.has(id));
}
这假设DATASOURCE
中没有多个具有重复ID的项目。
Set.has
具有O(1)
复杂度,而像.find
(或.includes
等(这样的阵列方法具有O(n)
复杂度。
怎么样
findItems(idList: string[]){
return DATASOURCE.filter(data => idList.includes(data.id));
}