Фильтр Rxjs и сопоставление ничего не возвращают

#javascript #angular #firebase #rxjs

#javascript #угловой #firebase #rxjs

Вопрос:

Я пытаюсь получить информацию из firebase и отфильтровать ее с помощью Rxjs 6.

У меня есть несколько вопросов по этому поводу:

  1. Я считываю объект по uid и получаю информацию. в этом объекте у меня есть избранное, и я пытаюсь отфильтровать из избранного только определенный uid. но я думаю, потому что его массив объектов я не могу фильтровать, поэтому я загружаю отдельно только избранное из firebase.
  2. когда я использую канал и фильтр, я получаю ошибку в ts. проблема в том, что свойство ‘uid’ не существует для типа ‘any[]’ . Я могу скомпилировать, только если использую // @ts-ignore. в любом случае, я ничего не получаю от rxjs.
  3. когда я использую map в фильтре, я получаю следующую проблему: data.favorite.filter не является функцией (в веб-консоли).

Структура базы данных:

 profile{
 NAg0E9IXrjeKMw3tLxPrlyvcdBr2{
        name:david,
        age:20,
        favorite{
                  NHXL2LD5LIfgdfvr{
                                   name:mike,
                                   uid:gh4Q0OEfNHXL2LD5LIgFpVmdmm92
                                  }
                  Q0OEfNHX2LD5Ldsdv{
                                   name:ron,
                                   uid:Vmdmm92dNHXL2LD5LIgFpEfNHXL2
                                   }
                 }
        }
 gh4Q0OEfNHXL2LD5LIgFpVmdmm92{
        name:mike,
        age:26,
        favorite{
                  rlyvcdBr25LdsIXrdv{
                                   name:david,
                                   uid:NAg0E9IXrjeKMw3tLxPrlyvcdBr2
                                   }
                 }
        }
}
  

сервисный код:

   getDataObj(objpath:string){
    this.objRef = this.db.object(objpath);
    this.obj = this.objRef.valueChanges();
    return this.obj;
   } 

   getDataList(listpath:string){
    this.itemsRef = this.db.list(listpath);
    this.items = this.itemsRef.snapshotChanges().pipe(
      map(changes => 
        changes.map(c => ({ key: c.payload.key, ...c.payload.val() }))
      )
    );
  return this.items;
  

код компонента:

 //Here I get Problem 3
   this.db.getDataObj("/Profile/"   this.uid).pipe(
map(data => data.favorite.filter((res) => res.uid===this.uid))).subscribe(res=>console.log(res));

//Here I get Problem 2
      this.db.getDataList("/Profile/"   this.userAuth.uid   "/favorite").pipe(filter(data => data.uid == this.uid)).subscribe(res => {                                  
          console.log(res)}); 
  

если я выполняю такой фильтр, у меня это работает:

       this.db.getDataList("/Profile/"   this.userAuth.uid   "/favorite").subscribe(res => {                                  
          console.log(res.filter(names =>names.uid == this.uid));
          console.log(res)}); 
  

Спасибо

Комментарии:

1. Поскольку вы используете typescript, вы можете попробовать фактически объявлять типы в своих объектах. Какие типы вы ожидаете на каждом шаге в ваших потоках?

2. Ваш data в массиве, он не имеет .uid . Вы должны использовать map вместо filter и использовать filter внутри map .

3. в любом случае, я получаю проблемные данные.uid не является функцией на карте