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

如何统计React中Firestore返回数据按date和prodID分组的出现次数?

解决方案

原有代码存在两个核心问题:

  • 重复发起Firestore查询,先查所有prodID再逐个prodID查数据,既浪费请求资源,也容易因为异步时序问题导致数据异常
  • 分组统计逻辑错误:你是按文档索引遍历往arr2里塞数据,并没有按照date+prodID的唯一键做分组计数,而是给所有匹配prodID的项都加计数,自然得不到正确结果

方案1:直接从Firestore拉取数据时就处理为目标格式(推荐)

一次性拉取所有商品数据,直接在本地做分组统计,不需要多次请求:

firebase
  .firestore()
  .collection("batch")
  .doc(ctx.currentUser.companyName)
  .collection("products")
  .orderBy("dateAdded", "desc")
  .get()
  .then((snapshot) => {
    // 用来临时存储分组计数的对象,key是`date|prodID`格式的唯一标识
    const countMap = {}
    snapshot.forEach(doc => {
      const data = doc.data()
      const date = getDate(data.dateAdded.seconds)
      const prodID = data.prodID
      // 生成唯一分组key
      const key = `${date}|${prodID}`
      // 计数累加
      if (!countMap[key]) {
        countMap[key] = { count: 1, date, prodID }
      } else {
        countMap[key].count += 1
      }
    })
    // 把map转成你要的数组格式
    const result = Object.values(countMap)
    // 这里直接使用result即可,不需要再存入summary数组二次转换
    console.log(result)
  })

方案2:如果已经拿到现有summary数组,直接转换为目标格式

如果你的summary数组已经是你贴出的结构,不需要再查询Firestore,直接用下面的代码转换即可:

const countMap = {}
// 遍历所有summary项
summary.forEach(item => {
  // 遍历每个item里的data数组
  item.data.forEach(record => {
    const { date, prodID } = record
    const key = `${date}|${prodID}`
    if (!countMap[key]) {
      countMap[key] = { count: 1, date, prodID }
    } else {
      countMap[key].count += 1
    }
  })
})
const result = Object.values(countMap)
// result就是你要的输出格式
console.log(result)

注:你给出的预期输出里Sep 19 2019属于笔误,实际转换后会是原始数据里的Sep 19 2021。


内容的提问来源于stack exchange,提问作者Chan Wei Jie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:27:05