Как установить фильтр в Typescript, который отфильтровывает строку, если она совпадает со строкой в ​​массиве? - PullRequest
0 голосов
/ 23 марта 2019

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

Поэтому я должен проверить, имеет ли каждый отдельный объект в моем наблюдаемом массиве идентификатор, совпадающий с идентификатором моего строкового массива.

Я пробовал это:

filter(docs => {
              docs.forEach(doc => {
                this.StringArray().forEach(string => {
                doc.id === string;
                });
              });
              return docs;
            })

Но я получаю ошибку компиляции: ...is not assignable to type 'boolean' и понятия не имею, как решить эту проблему.

Я новичок в Typescript, и если есть лучшее решение этой проблемы, я открыт для любых предложений. Также, если нужно больше кода, я бы обновил его.

ОБНОВЛЕНИЕ для этана:

 getSearchResult(searchRequest: Searchrequest) {

    return this.authService.user$.pipe(
      switchMap(user => {
       return this.angularFirestore
        .collection<any>('users', ref => ref.where('offers', 'array-contains', searchRequest.offerParam)
          .where('city', '==', searchRequest.cityParam)
          .where('sex', '==', searchRequest.sexParam))
        .snapshotChanges()
        .pipe(
          map(actions => {
            return actions.map(a => {
              const data = a.payload.doc.data() as User;
              const id = a.payload.doc.id;
              return { id, ...data };
            });
          }),
          filter(docs => {
              docs.filter(doc => this.getUsersToBeExcludedArray().includes(doc.uid));
            })
        );
      }
      )
    );
  }

2. Обновление

getSearchResult(searchRequest: Searchrequest) {
    console.log(this.getUsersToBeExcludedArray());

    return this.authService.user$.pipe(
      switchMap(user => {
       return this.angularFirestore
        .collection<any>('users', ref => ref.where('offers', 'array-contains', searchRequest.offerParam)
          .where('city', '==', searchRequest.cityParam)
          .where('sex', '==', searchRequest.sexParam))
        .snapshotChanges()
        .pipe(
          map(actions => {
            return actions.map(a => {
              const data = a.payload.doc.data() as User;
              const id = a.payload.doc.id;
              return { id, ...data };
            });
          }),
          // docs is an array
          filter(docs => {
            return this.getUsersToBeExcludedArray().includes(docs.id); // can't access docs.id
          })
        );
      }
      )
    );
  }

1 Ответ

0 голосов
/ 23 марта 2019

RxJS filter работает так же, как Array.prototype.filter.

Что вы можете сделать, это:

docs.filter(doc => this.StringArray().includes(doc.id));

Где docs - ваша наблюдаемая.

Обновление:

.pipe(
  map(actions => {
    ...
  }),
  map(docs => {
    return docs.filter(doc => this.getUsersToBeExcludedArray().includes(doc.uid));
  })
);

Фильтр RxJS: https://www.learnrxjs.io/operators/filtering/filter.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...