You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何降低JavaScript中计算用户总存款的时间复杂度?

优化用户存款总额计算的时间复杂度

问题描述

我有两个对象数组 users 和 deposits:

const users = [
    {
        _id: 1,
        username: 'tajmirul',
        email: 'tajmirul@gmail.com',
    },
    {
        _id: 2,
        username: 'tajmirul2',
        email: 'tajmirul2@gmail.com',
    },
];

const deposits = [
    {
        _id: 1,
        userId: 1,
        amount: 250,
    },
    {
        _id: 2,
        userId: 1,
        amount: 500,
    },
];

需要计算每个用户的总存款并更新 users 数组,最终效果如下:

// 修改后的 users 数组
[
    {
        _id: 1,
        username: 'tajmirul',
        deposit: 750,
    },
    {
        _id: 2,
        username: 'tajmirul2',
        deposit: 0,
    }
]

我当前用嵌套循环实现的代码时间复杂度是 O(m * n)(m为用户数量,n为存款记录数量):

users.forEach((user, index) => {
    deposits.forEach(deposit => {
        if (user._id === deposit.userId) {
            if (users[index].deposit) {
                users[index].deposit += deposit.amount;
            } else {
                users[index].deposit = deposit.amount;
            }
        }
    });
});

有没有办法降低时间复杂度?


优化方案:哈希表预处理存款数据

当然可以,核心是把嵌套循环拆成两次线性遍历,用哈希表(对象或Map)提前统计好每个用户的存款总额,时间复杂度能降到 O(m + n),具体实现如下:

步骤1:统计每个用户的总存款

先遍历一次deposits数组,用对象记录每个用户的累计存款:

const depositTotals = {};
deposits.forEach(deposit => {
    const userId = deposit.userId;
    // 有记录就累加,无记录则初始化为当前金额
    depositTotals[userId] = (depositTotals[userId] || 0) + deposit.amount;
});

步骤2:更新用户数组

再遍历一次users数组,给每个用户赋值对应的存款总额(没有存款的设为0):

users.forEach(user => {
    user.deposit = depositTotals[user._id] || 0;
    // 如果不需要保留email字段,可执行:delete user.email;
});

这种方法在数据量较大时优势非常明显,比如当用户数和存款记录数都达到上千条时,O(m+n)的效率会远高于O(m*n)的嵌套循环。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:09:10