我有一个JSON文件,其中包含以下对象数组:https://pastebin.com/raw/prnChamA。数据包含称为postitoimipaikka
的键,我需要循环访问这些键,以便仅获得键postitoimipaikka
中具有匹配值的那些对象。
用户输入字符串postitoimipaikka
作为函数参数,然后将其用于遍历对象的JSON数组。
我在atms.service.ts
中遇到以下错误:This condition will always return 'false' since the types 'string' and '() => string' have no overlap
在线:
if (d.postitoimipaikka == postitoimipaikka.toUpperCase) {
atms.service.ts:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { atm } from '../app/atm.interface';
@Injectable()
export class ATMService {
constructor(public http: HttpClient) { }
url = "./assets/data.json";
searchByMunicipalityName = (municipality: string): Promise<atm[]> => {
return new Promise((resolve, reject) => {
this.http.get(this.url).subscribe((data: atm[]) => {
let list: atm[] = [];
for (let d of data) {
if (d.postitoimipaikka == municipality.toUpperCase) {
lista.push(d);
}
}
resolve(list);
}, (error) => {
reject(error);
})
})
}
}
如果删除了toUpperCase
方法,则用户必须以大写形式键入该字符串,但该字符串不能正常工作。
答案 0 :(得分:2)
您的错误是您未调用toUpperCase
,因此必须在其后加上括号。另外,您定义了一个名为list
的数组,但实际上是在推入一个名为lista
的数组。
您可以将代码重构为此:
return new Promise((resolve, reject) => {
this.http.get(this.url).subscribe((data: atm[]) => {
resolve(data.filter(d => d.postitoimipaikka == municipality.toUpperCase()));
}, (error) => {
reject(error);
})
})
}
答案 1 :(得分:1)
我更喜欢使用filter()从数组中提取对象。我的版本如下:
searchByMunicipalityName = (municipality: string): Promise<atm[]> => {
return new Promise((resolve, reject) => {
this.http.get(this.url).subscribe((data: atm[]) => {
const list: atm[] = data.filter(x =>
x.postitoimipaikka === municipality.toUpperCase());
resolve(list);
}, (error) => {
reject(error);
})
})
}