JavaScript中Reduce转换数组为对象耗时过长的优化咨询
优化方案
原代码的性能瓶颈出现在构建usersMap的过程中——每次迭代都用对象扩展运算符{ ...aa }创建新对象,这会复制之前所有的键值对,20000次迭代下来时间复杂度是O(n²),自然耗时。
优化点1:直接修改累加器对象
不用每次创建新对象,直接在原累加器上赋值,时间复杂度降到O(n),这是最直接有效的优化:
const usersMap = allUsers.reduce((acc, user) => { acc[user.id] = user; return acc; }, {}); const matchedUsers = users.reduce((acc, user) => { const mappedUser = usersMap[user.id]; if (mappedUser) { acc.push(mappedUser); } return acc; }, []);
优化点2:用Set先存ID(按需选择)
如果只需要判断用户是否存在,或者可以接受后续二次匹配对象,也可以先把allUsers的ID存入Set,查找速度同样是O(1):
const userIdsSet = new Set(allUsers.map(user => user.id)); // 若只需要保留users中存在的项,直接过滤即可 const matchedUsers = users.filter(user => userIdsSet.has(user.id)); // 若需要allUsers里的完整对象,再做一次映射(注意:find是O(n),整体效率不如第一种方法) const matchedUsersWithFullData = users.filter(user => userIdsSet.has(user.id)) .map(user => allUsers.find(u => u.id === user.id));
如果最终要返回allUsers中的完整对象,第一种直接构建对象映射的方法效率更高,因为只需要遍历allUsers一次。
内容的提问来源于stack exchange,提问作者Chandrika
相关产品推荐
相关产品推荐

