You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }

实现说明

  1. 用Object.values(test)提取所有分类对象的数组
  2. 外层reduce维护累加器acc,初始值设为{ available: 0, used: 0 }
  3. 对每个分类的items数组做遍历,跳过缺少points或used的无效项
  4. 根据item.used的布尔值,将points累加到对应的统计字段
  5. 每次reduce迭代必须返回累加器,确保后续迭代能继续使用

内容的提问来源于stack exchange,提问作者user16860065

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:15:57