JavaScript合并含数组的对象值:统计可用与已用积分
正确实现按used状态累加points的方案
原始数据结构
const test = { cat1: { id: "c1", name: "category1", items: [ { itemName: "item1", points: 1, used: true }, { itemName: "item2", points: 3, used: false }, { itemName: "item3", points: 5, used: true } ] }, cat2: { id: "c2", name: "category2", items: [ { itemName: "item4", points: 7, used: true }, { itemName: "item5", points: 9, used: false } ] }, cat3: { id: "c3", name: "category3", items: [ { itemName: "item6" } ] } };
期望输出
{ available: 12, used: 13 }
原代码存在的问题
- 循环内部使用
return直接返回结果,导致reduce仅处理第一个符合条件的元素就提前终止,无法遍历所有数据 - 错误累加了
used布尔值,实际应累加points字段 - 未判断item是否同时存在
points和used属性,会处理无效数据 else分支错误访问了不存在的available属性,应该取points
正确实现方案
const result = Object.values(test).reduce((acc, category) => { // 遍历当前分类下的所有item category.items.forEach(item => { // 只处理同时包含points和used属性的有效item if (item.hasOwnProperty('points') && item.hasOwnProperty('used')) { if (item.used) { acc.used += item.points; } else { acc.available += item.points; } } }); // 必须返回累加器,保证reduce迭代正常进行 return acc; }, { available: 0, used: 0 }); console.log(result); // { available: 12, used: 13 }
实现说明
- 用
Object.values(test)提取所有分类对象的数组 - 外层
reduce维护累加器acc,初始值设为{ available: 0, used: 0 } - 对每个分类的
items数组做遍历,跳过缺少points或used的无效项 - 根据
item.used的布尔值,将points累加到对应的统计字段 - 每次
reduce迭代必须返回累加器,确保后续迭代能继续使用
内容的提问来源于stack exchange,提问作者user16860065
相关产品推荐
相关产品推荐

