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

如何用Lodash基于任务数组统计每位人员的任务数量?

使用Lodash高效统计人员任务分配情况

针对你的场景,我们可以通过Lodash的工具函数先预处理任务数据,生成快速查询的映射表,再结合人员数组生成结果,比原生JS的嵌套循环更高效,尤其是数据规模较大时。

一、生成带任务数量的结果数组

先通过_.flatMap展开所有任务关联的用户ID,再用_.countBy统计每个用户ID的出现次数,最后遍历人员数组合并统计结果:

const _ = require('lodash');

const array1 = [
    {id: 1, user: 'John'},
    {id: 2, user: 'Melinda'},
    {id: 3, user: 'Carl'},
    {id: 4, user: 'Eddie'}
];

const array2 = [
    {id: 5, task: 'a', users: [1]},
    {id: 6, task: 'b', users: [2]},
    {id: 7, task: 'c', users: [2,3]},
    {id: 8, task: 'd', users: []}
];

// 生成用户ID到任务数量的映射表
const userTaskCountMap = _.countBy(_.flatMap(array2, 'users'));

// 生成最终结果
const resultWithCount = _.map(array1, person => ({
    ...person,
    count: Number(userTaskCountMap[person.id]) || 0
}));

console.log(resultWithCount);

输出结果:

[
    {id: 1, user: 'John', count: 1},
    {id: 2, user: 'Melinda', count: 2},
    {id: 3, user: 'Carl', count: 1},
    {id: 4, user: 'Eddie', count: 0}
]

二、生成带任务列表的结果数组

用_.reduce遍历任务数组,构建用户ID到对应任务名称的映射表,再遍历人员数组合并任务列表:

// 生成用户ID到任务列表的映射表
const userTasksMap = _.reduce(array2, (acc, task) => {
    _.forEach(task.users, userId => {
        acc[userId] = acc[userId] || [];
        acc[userId].push(task.task);
    });
    return acc;
}, {});

// 生成最终结果
const resultWithTasks = _.map(array1, person => ({
    ...person,
    tasks: userTasksMap[person.id] || []
}));

console.log(resultWithTasks);

输出结果:

[
    {id: 1, user: 'John', tasks: ['a']},
    {id: 2, user: 'Melinda', tasks: ['b','c']},
    {id: 3, user: 'Carl', tasks: ['c']},
    {id: 4, user: 'Eddie', tasks: []}
]

效率说明

这种方式只需要遍历任务数组一次生成映射表,之后遍历人员数组是线性时间复杂度O(n),避免了原生JS嵌套循环的O(n*m)复杂度,数据量越大,性能优势越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:35:38