如何使用reduce()方法统计数组对象中唯一livingId的数量
解决JavaScript reduce()同时统计订单总数与唯一livingId数量的问题
你可以通过在reduce的累加器中引入Set(自动去重的集合)来同时完成两个统计需求,具体实现如下:
示例订单数组
const orders = [ { livingId: '101' }, { livingId: '102' }, { livingId: '101' }, { livingId: '103' }, { livingId: '102' }, { livingId: '101' } ];
基于reduce的实现代码
const stats = orders.reduce((acc, currentOrder) => { // 累加订单总数 acc.totalOrders++; // 将当前livingId存入Set,自动过滤重复值 acc.uniqueLivingIds.add(currentOrder.livingId); return acc; }, { totalOrders: 0, uniqueLivingIds: new Set() // 初始值包含计数器和空Set }); // 转换为最终需要的统计结果 const finalResult = { totalOrders: stats.totalOrders, uniqueLivingIdCount: stats.uniqueLivingIds.size }; console.log(finalResult); // 输出:{ totalOrders: 6, uniqueLivingIdCount: 3 }
核心思路说明
- 累加器初始值:设置一个包含
totalOrders(订单总数计数器)和uniqueLivingIds(存储唯一livingId的Set)的对象,作为reduce的初始值。 - 订单总数统计:每遍历一个订单,直接对
totalOrders做自增操作。 - 唯一值统计:利用Set的特性(不允许重复元素),将每个订单的
livingId添加到Set中,最后通过Set.size即可得到唯一livingId的数量。
替代方案(不用Set)
如果不想使用Set,也可以用普通对象来标记已出现的livingId:
const stats = orders.reduce((acc, currentOrder) => { acc.totalOrders++; // 用对象键存储已出现的livingId,值随意(这里用true标记) acc.uniqueIds[currentOrder.livingId] = true; return acc; }, { totalOrders: 0, uniqueIds: {} }); const finalResult = { totalOrders: stats.totalOrders, uniqueLivingIdCount: Object.keys(stats.uniqueIds).length };
内容的提问来源于stack exchange,提问作者LukeLuc
相关产品推荐
相关产品推荐

