gpt4 book ai didi

javascript - 如何过滤来自 Firestore 数据库的数据

转载 作者:行者123 更新时间:2023-12-01 00:01:19 26 4
gpt4 key购买 nike

我想实现这个filtering在我的代码上,但我在实现它时遇到问题。

FILTERING

我在实现这行代码时遇到错误:

function search(text: string, pipe: PipeTransform): Country[] {
return COUNTRIES.filter(country => {
const term = text.toLowerCase();
return country.name.toLowerCase().includes(term)
|| pipe.transform(country.area).includes(term)
|| pipe.transform(country.population).includes(term);
});
}

我无法更改COUNTRIES.filter,当我尝试在其上放置/替换我的函数时收到错误。我收到此错误“类型“void”上不存在属性“过滤器”

这是我的代码。

export class MyComponent implements OnInit {

countries: Observable<any[]>;
filter = new FormControl('');

listQuestions = [];


constructor(private extractorService: ExtractorService,
private fstore: AngularFirestore) { }

ngOnInit() {
this.filterFunction();
}

filterFunction(){
this.countries = this.filter.valueChanges.pipe(
startWith(''),
map(text => this.search(text))
);
}

search(text: string): any[] {
return this.sampleFunction().filter(country => {
const term = text.toLowerCase();
return country.caseID.toLowerCase().includes(term)
|| (country.word).toLowerCase().includes(term)
|| (country.product).toLowerCase().includes(term);
});
}

sampleFunction() {
this.extractorService.dbFirestore().subscribe(data => {
this.listQuestions = data.map(x => {
return x.payload.doc.data();
})
})
}

我可以从我的 sampleFunction() 获取 Firebase 的所有数据。

顺便说一句,我使用以下代码加载 html 上的数据:

<tr *ngFor="let item of countries | async">

您能否帮助我将在 sampleFunction() 上获得的数据用于搜索功能,其中指南使用行“return COUNTRIES.filter(country => {

最佳答案

您不会将所有可观察对象返回到async管道。您正在执行手动订阅并映射结果。

filterFunction() {
this.countries = this.filter.valueChanges.pipe(
startWith(''),
switchMap(text => this.search(text))
);
}

search(text: string): Observable<any[]> {
return this.sampleFunction().pipe(
map(countries => {
return countries.filter(country => {
const term = text.toLowerCase();
return country.caseID.toLowerCase().includes(term)
|| (country.word).toLowerCase().includes(term)
|| (country.product).toLowerCase().includes(term);
});
});
);
}

sampleFunction(): Observable<any[]> {
return this.extractorService.dbFirestore().pipe(
map(data => data.map(x => x.payload.doc.data()))
);
}

我建议尽可能向函数添加返回类型,Typescript 非常擅长发现像这样的基于类型的小错误。

现在的一个潜在问题是,每次过滤器值发生更改时都会调用 this.extractorService.dbFirestore()。如果您不希望这种情况发生,您需要采用不同的方法。

使用静态数据

您可能只想先加载数据,然后过滤固定数组。在这种情况下,您将首先加载数据,然后使用 concatMap 将值更改链接到该数据。

filteredCountries$: Observable<any[]>;
private countries: any[];

filterFunction() {
// load the countries first
this.filteredCountries$ = this.getCountries().pipe(
// set the countries
tap(countries => this.countries = countries),
// now start observing the filter changes
concatMap(countries => {
return this.filter.valueChanges.pipe(
startWith(''),
map(text => this.search(text))
})
);
}

search(text: string): any[] {
return countries.filter(country => {
const term = text.toLowerCase();
return country.caseID.toLowerCase().includes(term)
|| (country.word).toLowerCase().includes(term)
|| (country.product).toLowerCase().includes(term);
});
}

getCountries(): Observable<any[]> {
return this.extractorService.dbFirestore().pipe(
map(data => data.map(x => x.payload.doc.data()))
);
}

那么您的 HTML 将观看 filteredCountries$ 而不是 countries

<tr *ngFor="let item of filteredCountries$ | async">

关于javascript - 如何过滤来自 Firestore 数据库的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60702061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com