TypeScript中动态键对象解构的性能优化方案问询
优化方案:提升数据集匹配性能
以下是针对你的性能问题优化后的完整代码,同时会拆解核心优化点:
export async function filterItems( usersItems: Record<string, string>[], latestItems: Record<string, string> ): Promise<string[]> { // 预先生成latestItems值的Set,将O(n)查找转为O(1) const latestVersions = new Set(Object.values(latestItems)); const filteredItemsForUser: string[] = []; for (const item of usersItems) { // 利用usersItems每个元素是单键对象的特性,直接获取唯一键值对 const itemId = Object.keys(item)[0]; const version = item[itemId]; if (latestVersions.has(version)) { filteredItemsForUser.push(itemId); } } console.log("filteredItemsForUser: " + filteredItemsForUser); return filteredItemsForUser; } // 测试数据 const usersItems: Record<string, string>[] = [ {"id1": "ID#id1#VERSION#1"}, {"id2": "ID#id2#VERSION#1"}, {"id4": "ID#id4#VERSION#2"}, {"id6": "ID#id6#VERSION#1"}, ]; const latestItems: Record<string, string> = { "id1": "ID#id1#VERSION#1", // 匹配 "id2": "ID#id2#VERSION#4", // 不匹配(版本不同) "id3": "ID#id3#VERSION#5", "id4": "ID#id4#VERSION#2", // 匹配 "id5": "ID#id5#VERSION#5", "id6": "ID#id6#VERSION#6", // 不匹配(版本不同) }; filterItems(usersItems, latestItems);
核心优化点
- 版本查找效率从O(n)升级为O(1):
原代码中每次调用Object.values(latestItems).includes(version)都会遍历5k条数据的数组,而Set的has()方法基于哈希表实现,单次查找仅需O(1)时间,预先生成一次Set即可复用所有查找操作,直接砍掉大量重复遍历开销。 - 移除冗余内层循环:
从测试数据能明确usersItems的每个元素都是单键值对对象,原代码里的内层for...of Object.entries(item)循环完全多余,直接通过Object.keys和对象取值获取键值对,避免不必要的循环与解构消耗。 - 避免重复计算:
原代码在每次内层循环都会重新生成Object.values(latestItems)数组,优化后仅在函数开头生成一次Set,彻底消除重复创建数组的内存与性能浪费。
内容的提问来源于stack exchange,提问作者tmc
相关产品推荐
相关产品推荐

