提问者:小点点

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


null

  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
            });
         });
      });
    }

null

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

private Matchitinerary:allItineraries=[];

然后我试着这样宣布:

private Allitineraries:{“id”:string,“activities”:any[],“destination”:string,“start date”:string,“end date”:string,“job id”:string,“user id”:string}[]=[];

还是没起作用。

这个问题是由于FireBase中查询的局限性造成的。因此,我需要删除重复的记录。从firebase检索数据后,数组函数无法识别。我无法获取元素,我无法使用。length.。。它=0。当我console.log(allItineraries类型)时,它显示Object。

null

        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];
            }
          }
        }

null

数据将显示在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(...);
     });
  });
}