处理大量用户数据时,用数组还是对象存储更高效?
我在做一个需要频繁搜索用户ID的组件,当前用数组存储用户对象,通过遍历查找ID:
const users = [{id:1, name:'Alice'}, ...];
function findUser(id) {
for(let user of users) {
if(user.id === id) return user;
}
}
当数据超过1万条时明显卡顿,试过把数据转成对象形式:
const userMap = {1: {id:1, name:'Alice'}, ...};
function findUser(id) {
return userMap[id];
}
这样性能会更好吗?有没有其他更优的数据结构选择?
数组遍历是O(n)复杂度,1万条数据最坏要遍历1万次才能找到。对象键值查找是O(1),直接用ID当key,一瞬间就能拿到数据,这个性能差距是质变的。
不过你现在的写法有个小问题:如果ID不是连续的数字或者有字符串ID,用普通对象可能会有原型链污染的风险。建议用Map:
Map在大量数据下比普通对象更稳定,而且key的类型不受限制。
如果你的搜索场景不只是按ID,还有按name或其他字段查的需求,那就得建索引:
这样每种查询条件都能做到O(1)。内存占用会多一倍,但换来查询速度绝对值。
你这userMap这种结构直接查哈希表,时间复杂度O(1)的,比数组遍历O(n)不知道高到哪里去了
要是还要支持按ID增删改查,试试看Map结构:
比普通对象还适合这种键值对操作,内存占用还小