【问题标题】:How do I get the total number of occurrence for each array in an object?如何获取对象中每个数组的出现总数?
【发布时间】:2021-09-22 11:50:28
【问题描述】:

我目前在 React 中有这个对象,我似乎无法得到我想要的输出,我不确定我是否正确地构造了这个对象。使用 Firestore 检索数据。我已将结果存储到此摘要数组中并尝试对其进行处理

const summary = [
        {
          data: [
            {
              date: "Sep 21 2021",
              prodID: "005",
            },
          ],
        },
        {
          data: [
            {
              date: "Sep 21 2021",
              prodID: "002",
            },
            {
              date: "Sep 21 2021",
              prodID: "002",
            },
          ],
        },
        {
          data: [
            {
              date: "Sep 21 2021",
              prodID: "004",
            },
            {
              date: "Sep 21 2021",
              prodID: "004",
            },
            {
              date: "Sep 21 2021",
              prodID: "004",
            },
            {
              date: "Sep 19 2021",
              prodID: "004",
            },
            {
              date: "Sep 19 2021",
              prodID: "004",
            },
          ],
        },   ];

是否有可能得到这个输出..我已经尝试了无数个小时了..我如何编码才能得到这样的结果?

[
    {
        "count": 1,
        "date": "Sep 21 2021",
        "prodID": "005"
    },
    {
        "count": 2,
        "date": "Sep 21 2021",
        "prodID": "002"
    },
    {
        "count": 3,
        "date": "Sep 21 2021",
        "prodID": "004"
    },
    {
        "count": 2,
        "date": "Sep 19 2019",
        "prodID": "004"
    }
]

这是我尝试过的最新逻辑

firebase
  .firestore()
  .collection("batch")
  .doc(ctx.currentUser.companyName)
  .collection("products")
  .get()
  .then((snapshot) => {
    let arr = [];
    snapshot.forEach((doc) => {
      const dt = doc.data().prodID;
      if (!arr[dt]) {
        arr[dt] = 1;
      } else {
        arr[dt] += 1;
      }
    });

    for (const t in arr) {
      firebase
        .firestore()
        .collection("batch")
        .doc(ctx.currentUser.companyName)
        .collection("products")
        .where("prodID", "==", t)
        .orderBy("dateAdded", "desc")
        .get()
        .then((snapshot) => {
          let arr2 = [];
          let c = 0;
          snapshot.forEach((doc) => {
            const dt = getDate(doc.data().dateAdded["seconds"]);
            if (!arr2[c]) {
              arr2[c] = { count: 1, date: dt, prodID: t };
            } else {
              console.log("in");
              if (arr2.prodID === t) {
                for (const d in arr2) {
                  if (arr2[d].count) {
                    arr2[d].count++;
                  }
                }
              }
            }
            c++;
          });
          let v = {};
          v["data"] = arr2;
          addSummary(v);
        });
    }
  });

这是我执行后得到的结果

for (let j = 0; j < summary.length; j++) {
      for (let k = 0; k < summary[j].data.length; k++) {
        console.log(summary[j].data[k]);
      }
    }

console result

【问题讨论】:

  • 请分享您的尝试
  • 1) 创建新的空数组:const result = [] 2) 遍历summary 的每个data 元素(使用嵌套循环)并检查它是否已经存在于结果数组中 3) 如果因此,将计数加一 4) 如果没有,则推送到数组。
  • 或者你可以等几分钟,有人会直接给你解决方案。

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

遍历数据并为每个唯一日期 (new Set(d.data.map(prod =&gt; prod.date))) 添加到 result 计数 (d.data.filter(prod =&gt; prod.date === date).length)

const summary = [{
    data: [{
      date: "Sep 21 2021",
      prodID: "005",
    }, ],
  },
  {
    data: [{
        date: "Sep 21 2021",
        prodID: "002",
      },
      {
        date: "Sep 21 2021",
        prodID: "002",
      },
    ],
  },
  {
    data: [{
        date: "Sep 21 2021",
        prodID: "004",
      },
      {
        date: "Sep 21 2021",
        prodID: "004",
      },
      {
        date: "Sep 21 2021",
        prodID: "004",
      },
      {
        date: "Sep 19 2021",
        prodID: "004",
      },
      {
        date: "Sep 19 2021",
        prodID: "004",
      },
    ],
  },
];
const result = []
summary.forEach(d => {
    let dates = new Set(d.data.map(prod => prod.date))
    dates.forEach(date => {
      result.push({
        date: date,
        prodId: d.data[0].prodID,
        count: d.data.filter(prod => prod.date === date).length
      })
    })
})
console.log(result)
假设 summary 等于 snapshot 您的代码应该/可能看起来像:
firebase
  .firestore()
  .collection("batch")
  .doc(ctx.currentUser.companyName)
  .collection("products")
  .get()
  .then((snapshot) => {
    const result = []
    snapshot.forEach(doc => {
        let dates = new Set(doc.data.map(prod => prod.date))
        dates.forEach(date => {
          result.push({
            date: date,
            prodId: doc.data[0].prodID,
            count: doc.data.filter(prod => prod.date === date).length
          })
        })
    })
    console.log(result)
  })

【讨论】:

  • 非常感谢你!这是我需要的解决方案!
  • @ChanWeiJie 如果找到答案/问题有帮助别忘了点赞
  • 恐怕我无法投票,“感谢您的反馈!您需要至少 15 声望才能投票,但您的反馈已被记录。”是他们在我尝试投票时显示的信息
  • @ChanWeiJie 你可以接受这个作为你提出问题的答案
猜你喜欢
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多