我无法从 firebase 操作存储在数组中的数据

Posted

技术标签:

【中文标题】我无法从 firebase 操作存储在数组中的数据【英文标题】:I'm unable to manipulate data stored in an array from firebase 【发布时间】:2019-11-03 19:20:21 【问题描述】:

我正在使用以下复合查询从 firebase 获取数据:

  filterItineraries(filters: any): any 
    this.allItineraries = [];
    this.filteredItineraries = [];

    for ( let i = 0; i < filters.dateRange.length; i ++) 
    const query = this.dataSvc.getAllItineraries()
    .where('destination', '==', filters.destination)
    .where('dateRange', 'array-contains', filters.dateRange[i]);
    query.onSnapshot(itineraryListSnapshot => 
          itineraryListSnapshot.forEach(snap => 
              this.allItineraries.push(
                id: snap.id,
                activities: snap.data().activities,
                destination: snap.data().destination,
                startDate: snap.data().startDate,
                endDate: snap.data().endDate,
                jobId: snap.data().jobId,
                userId: snap.data().userId
            );
         );
      );
    

我最初声明了存储对象的数组,如下所示:

私下匹配行程:allItineraries = [];

然后我尝试这样声明:

private allItineraries: 'id': string, 'activities': any[], 'destination': string, 'startDate': string, 'endDate': string, 'jobId': string, 'userId': string [] = [];

还是不行。

此问题是由于 firebase 中查询的限制造成的。结果,我最终得到了需要删除的重复记录。从 firebase 检索数据后,无法识别数组函数。我无法获取元素,我无法使用 .length...it = 0。当我使用 console.log(typeof allItineraries) 时,它会显示对象。

        for (let i = 0; i < allItin.length; i++) 
          for (let k = 0; k < allItin.length - 1; k++) 
            if (allItin[k].id !== allItin[k + 1].id) 
              console.log('inside if', allItin[k + 1].id);
              this.filteredItineraries[k] = allItin[k + 1];
            
          
        

数据将显示在 UI 中,但我无法在我的代码中执行任何数组操作。如果我只是做一个 console.log(allItineraries) 它实际上会显示所有数据,但我需要做的是过滤数据,它不会让我执行任何数组操作。

我已经为此工作了几个星期,并且发布了很多次都无济于事。我现在不知道该怎么做......似乎没有任何效果。我不知道我是否声明数组错误。可以看到数据,但不能像普通数组允许的那样对其进行操作。

【问题讨论】:

【参考方案1】:

将数据保存在局部变量中并在快照回调中过滤。

filterItineraries(filters: any): any 

for ( let i = 0; i < filters.dateRange.length; i ++) 
const query = this.dataSvc.getAllItineraries()
.where('destination', '==', filters.destination)
.where('dateRange', 'array-contains', filters.dateRange[i]);
query.onSnapshot(itineraryListSnapshot => 

   const allItineraries = [];
   const filteredItineraries = [];

      itineraryListSnapshot.forEach(snap => 
          allItineraries.push(
            id: snap.id,
            activities: snap.data().activities,
            destination: snap.data().destination,
            startDate: snap.data().startDate,
            endDate: snap.data().endDate,
            jobId: snap.data().jobId,
            userId: snap.data().userId
        );
      // filter your array here 
      // save it in state or assign it to filteredItineraries[]
      // doing the following won't force state re-render
      // this.filteredItineraries = allItineraries.filter(...);
     );
  );

【讨论】:

以上是关于我无法从 firebase 操作存储在数组中的数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 填充数组传递 UITableViewCell 数据

无法将数据从 Firebase 附加到数组 SwiftUI

Firebase 网络将聊天存储为实时数据库中的数组

渲染从 firebase firestore 获取的数组数据

Firebase/Flutter - 无法将数据写入数据库

使用 Angular 7 从 Firebase 存储中检索图像