【问题标题】:Iterating over Firestore array of maps迭代 Firestore 地图数组
【发布时间】:2020-01-18 09:14:36
【问题描述】:

我正在尝试重构数据库,但在尝试使用其中的数据填充表时遇到了麻烦。

这是我的数据库的新结构。

所以,我们可以看到 newLayout > User ID > reviews,这是一个地图数组。我可以注销整个评论数组 - 但无法弄清楚如何访问甚至注销评论数组中的每个单独的对象/地图。


    this.firebaseService.getNewReports().subscribe(docs => {

      this.reports =  docs.map(item => {

        return {
          id:  item.payload.doc.id,
          ...item.payload.doc.data()
        };
      });   

      this.reports.forEach(element => {

        console.log(element.reviews);

      });

    });

每个评论数组都被注销

我什至无法注销一个对象 - 我认为即使 console.log(element.reviews[0]) 也可以,但它说“无法读取未定义的属性 0”。我只能退出整个评论数组。

我正在寻找的是一次迭代并从每个文档中检索每个评论的内容,并将它们分配到一个大对象数组中,以用作 MatTableDataSource 的源。

就这样

    [
    {county: Cork, dateAdded: " ", ...}, 
    {county: Cork, dateAdded: " ", ...},
    {county: Clare, dateAdded: " ", ...}
    ]

在我之前的简单数据库结构中,这是一个简单的操作,因为我可以检索整个集合并将其分配给一个数组。该结构对于其他功能来说是不切实际的,所以现在我包含了有意义的 ID。

Previous database structure

任何帮助将不胜感激,这花费的时间变得非常愚蠢。我已经在互联网和文档中寻找解决方案,但我开始觉得我从一开始就做错了我的数据库结构。

【问题讨论】:

  • 那么实际输出是什么(包括(字符串化 JSON)代码,而不是图像)以及预期输出是什么。我个人不明白你对newLayout > ID > 0{ } 1{ } 2{ }的意思
  • 道歉@AJT82 - 我已经厌倦了试图弄清楚这一点,以至于连贯打字的意志力是一场斗争。我刚刚编辑了帖子,希望我的困境现在更清楚了:)
  • 根据您希望的输出更新了我的答案! :) 希望对您有所帮助!

标签: arrays angular typescript google-cloud-firestore maps


【解决方案1】:

编辑:

如果你想要的输出是单个数组,比如...

[
  {county: Cork, dateAdded: " ", ...}, 
  {county: Cork, dateAdded: " ", ...},
  {county: Clare, dateAdded: " ", ...}
]

..然后在您的forEach 中将每个数组的内容推送到一个数组中,这里是finalReports,使用展开运算符,如下所示:

  finalReports = [];

  // ...

  this.reports.forEach(element => {
    this.finalReports.push(...element.reviews)
  });

如果你愿意,你也可以提前做:

  docs.map(item => {
    this.finalReports.push(...item.payload.doc.data().reviews)
  });   

原帖:

经过一番思考 ;) 我认为弄清楚了您希望输出的样子,即:

[
  {
    A11: [{county: ....}, {...}]
  }, 
  {
    A154: [{county: ...}, {...}]
  }   
]

可以通过以下方式实现:

this.reports =  docs.map(item => {
  return {
    return { [item.payload.doc.id] : item.payload.doc.data().reviews }
  };
});  

所以我们将id设置为prop名称,并将payload中的数组reviews设置为prop值。

【讨论】:

  • 我的上帝...谢谢一百万!你绝对拯救了这一天 - 桌子又开始运作了。我希望其他人在我的困境中发现这一点。您的第一个建议也是一个不错的技巧,我会留意使用它的场景。出于好奇,对于您的旧建议和不使用 forEach 循环的新建议 - 他们都抛出错误提示“类型 {} 上不存在属性‘评论’”。我在item.payload.doc.data().reviews 的评论中得到一条红线@ 知道为什么会这样吗?另一个版本完美无缺,如果不是,也没什么大不了的。
  • 该错误来自输入问题。这是 typescript 最棒的部分,它在开发时分配数据时帮助你很多。所以实际解决这个问题的方法是输入你的数据(避免不惜一切代价使用any!!)所以我建议创建一个接口,然后告诉编译器你期望的那种类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2021-01-07
  • 2014-03-23
相关资源
最近更新 更多