Angular项目中如何用TypeScript过滤Firm数组匹配指定domain
Angular项目中实现Firm数组过滤的current方法
我正在开发一个Angular项目,需要过滤Firm类型数组,找出其中domain属性等于当前类中this.domain的元素。我初步写的思路代码如下:
let firms: Array<any> = this.firms.filter( (this.firms) => { if (firms.domain===this.domain) } )
以下是当前的FirmService代码,需要完善current方法实现该过滤逻辑:
import {Injectable} from '@angular/core'; import {FirmProvider} from '../../providers/business/firm/firm.provider'; import {Firm} from "../../providers/business/firm/firm"; @Injectable({ providedIn: 'root', }) export class FirmService { protected domain: string; protected firms: Firm[] = []; protected initialized: boolean = false; constructor(private firmProvider: FirmProvider) { this.domain = window.location.hostname.replace(/.\w+.\w+$/ig, ''); if (this.initialized) { this.firmProvider .getAll() .then((firms) => { this.firms = firms; this.initialized = true; return firms; }); } } all = (): PromiseLike<Firm[]> => { if (this.initialized) { return new Promise<Firm[]>((resolve) => {resolve(this.firms)}); } return this.firmProvider .getAll() .then((firms) => { this.firms = firms; this.initialized = true; return firms; }); } current() { // filter array of firms to find firm where domain is equal to this.domain } }
问题修正与方法实现
你的初始过滤代码存在几个问题:
- 箭头函数参数命名错误,不能用
this.firms作为参数名,应该传入单个Firm对象(比如firm) - 箭头函数内没有返回判断结果,
filter要求回调函数返回布尔值 - 类型声明应使用
Firm[]而非Array<any>,保证类型安全
另外要注意,firms数据可能还未初始化,所以current方法需要和all方法保持一致的异步逻辑,返回Promise<Firm | undefined>(避免找不到匹配项时的类型问题)。
完善后的current方法如下:
current(): Promise<Firm | undefined> { // 确保firms数据已加载完成 return this.all().then(firms => { // 找到第一个domain匹配的元素,若需多个匹配项可改用filter return firms.find(firm => firm.domain === this.domain); }); }
补充说明
- 使用
find而非filter:如果只需要第一个匹配项,find更高效,找到匹配项后会立即停止遍历;若需多个匹配结果,再替换为filter返回数组 - 异步处理:通过
this.all()保证无论数据是否初始化,都能获取到最新的firms数组,避免未加载完成时的空数组问题 - 类型安全:明确返回类型为
Firm | undefined,调用方可清晰处理找不到匹配项的边界情况
内容的提问来源于stack exchange,提问作者new brain
相关产品推荐
相关产品推荐

