如何根据键名递增JavaScript对象中的计数属性值?
解决JavaScript中按任务处理人统计待办任务数的简洁实现
你当前代码的核心问题是:每次遍历任务时,都会把itemsPerAssignee[assignee]重新赋值为{count: 0},不管之前是否已经存在该处理人的统计项,导致计数始终被重置,无法累加。
下面是几种简洁的修正方案:
方案1:短路求值初始化(兼容所有ES版本)
query.forEach(function(task) { const assignee = task.getAssignee(); // 若当前处理人未被统计,先初始化count为0;已存在则直接复用现有对象 itemsPerAssignee[assignee] = itemsPerAssignee[assignee] || { count: 0 }; // 计数累加 itemsPerAssignee[assignee].count++; });
方案2:逻辑赋值简化(ES2021+)
利用空值合并赋值运算符??=,可以更紧凑地完成初始化+累加:
query.forEach(task => { const assignee = task.getAssignee(); // 仅当assignee对应的属性不存在时,才初始化{count:0},随后直接自增 (itemsPerAssignee[assignee] ??= { count: 0 }).count++; });
方案3:用reduce一步生成统计结果
如果不需要提前声明空对象,可以用Array.reduce直接生成最终的统计对象,代码更聚合:
const itemsPerAssignee = query.reduce((acc, task) => { const assignee = task.getAssignee(); acc[assignee] = acc[assignee] || { count: 0 }; acc[assignee].count++; return acc; }, {});
修正你的测试代码
你的测试代码存在两个明显问题:
- 数组元素错误:第一个元素是逗号拼接的字符串,应该拆分为独立的邮箱地址
- 遍历数组方式错误:
for...in遍历数组拿到的是索引而非元素值
修正后的测试代码:
let itemsPerAssignee = {}; const users = ["user@user.com", "anotheruser@another.com", "user@user.com"]; users.forEach(user => { itemsPerAssignee[user] = itemsPerAssignee[user] || { count: 0 }; itemsPerAssignee[user].count++; }); // 遍历输出统计结果 for (const user in itemsPerAssignee) { console.log(`${user}: ${itemsPerAssignee[user].count}`); }
执行后会输出:
user@user.com: 2 anotheruser@another.com: 1
内容的提问来源于stack exchange,提问作者Saffe
相关产品推荐
相关产品推荐

