Я не могу манипулировать данными, хранящимися в массиве из firebase - PullRequest
1 голос
/ 21 июня 2019

Here is a screenshot of the console log of the array Я получаю данные из 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
            });
         });
      });
    }

Сначала я объявил массив, в котором я храню объекты, следующим образом:

приватный матчItinerary: allItineraries = [];

тогда я попытался объявить так:

private allItineraries: {'id': строка, 'активность': любая [], 'destination': строка, 'startDate': строка, 'endDate': строка, 'jobId': строка, 'userId': строка } [] = [];

все еще не работал.

Проблема вызвана ограниченностью запросов в 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];
            }
          }
        }

Данные будут отображаться в пользовательском интерфейсе, но я не могу выполнить какие-либо операции с массивами в моем коде. Если я просто сделаю console.log (allItineraries), он на самом деле покажет все данные, но мне нужно отфильтровать данные, и он не позволит мне выполнять какие-либо операции с массивом.

Я работаю над этим уже несколько недель и много раз публиковал безрезультатно. Я не знаю, что делать в этот момент ... кажется, ничего не работает. Я не знаю, неправильно ли я объявляю массив. Данные можно просматривать, но не манипулировать, как позволяют обычные массивы.

1 Ответ

1 голос
/ 21 июня 2019

Сохранение данных в локальной переменной и фильтрация внутри обратного вызова снимка.

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(...);
     });
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...