如何用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
相关产品推荐
相关产品推荐

