JavaScript:从字典数组统计各userId的completed为true的次数
按userId统计completed为true的计数
你可以用Array.reduce()方法高效实现这个统计,它只需要遍历一次数组,适合处理大型数据集:
const data = [{"userId":1, "completed":true}, {"userId":1, "completed":false}, {"userId":1, "completed":true}, {"userId":2, "completed":false}, {"userId":2, "completed":true} ]; const completedCounts = data.reduce((acc, item) => { // 初始化当前userId的计数(如果还没存在的话) acc[item.userId] = acc[item.userId] || 0; // 仅当completed为true时增加计数 if (item.completed) { acc[item.userId]++; } return acc; }, {}); console.log(completedCounts); // 输出结果: { 1: 2, 2: 1 }
代码说明
reduce的初始值是一个空对象{},用来存储每个userId对应的计数- 遍历数组时,先检查当前userId是否已经在累加器
acc中,没有的话就设为0 - 当
item.completed为true时,给对应userId的计数加1 - 最终返回的
acc就是我们需要的统计结果
如果你更倾向于先过滤再统计的直观逻辑,也可以先筛选出所有completed: true的项,再用reduce统计:
const completedItems = data.filter(item => item.completed); const completedCounts = completedItems.reduce((acc, item) => { acc[item.userId] = (acc[item.userId] || 0) + 1; return acc; }, {});
这种方式逻辑更易懂,但对于超大型数组,一次reduce遍历的效率会更高,因为减少了一次数组遍历操作。
内容的提问来源于stack exchange,提问作者Malcom
相关产品推荐
相关产品推荐

