正在删除typescript中字符串数组上的筛选器



如果有人能帮助我,我们将不胜感激:(。我一直在为打字脚本的语法而挣扎(这里是初学者(。

我需要重构这段代码,以便获得serviceBranches的完整列表。正确的一些过滤和映射已经完成,一个serviceBranch正在从我们的API返回。我已经试过删除一些过滤器,但可能不是正确的。有人能帮我获得所有的serviceBranch吗(所以按顺序删除正确的过滤器(。

谢谢。

public async personNews(serviceBranch?: string[]): Promise<INews> {
const fetchResult: IPersonNewsFetchResultEntry[] = await this._get('api/person/news/', newsSchema, true) as IPersonNewsFetchResultEntry[];
const serviceBranches: string[] = (serviceBranch !== undefined ? serviceBranch : fetchResult.filter((entry: IPersonNewsFetchResultEntry, index: number, array: IPersonNewsFetchResultEntry[]): boolean => { 
return entry.niveauID === NewsLevel.ServiceBranch && array.findIndex((value: IPersonNewsFetchResultEntry): boolean => {
return entry.unitID === value.unitID;
}) === index;
}).map((entry: IPersonNewsFetchResultEntry): string => {
return entry.unitID;
}));

所有东西都有显式类型是有原因的吗?

是因为this._get('api/person/news/', newsSchema, true);返回any吗?

经过轻微的重构和删除类型后,更加清晰

public async personNews(serviceBranch?: string[]): Promise<INews> {
const fetchResult = await this._get('api/person/news/', newsSchema, true);
let serviceBranches: string[] = [];
if(serviceBranch) {
serviceBranches = serviceBranch;
return;
}
serviceBranches = fetchResult.filter((entry, index, array) => { 
return entry.niveauID === NewsLevel.ServiceBranch
&& array.findIndex(({unitID}) => entry.unitID === unitID) === index;
}).map(entry => entry.unitID)
}

这是一个非常密集的函数,对于人类来说很难解析和理解。所以让我们更好地格式化它:

public async personNews(serviceBranch?: string[]): Promise<INews> {
const fetchResult: IPersonNewsFetchResultEntry[] = (await this._get(
'api/person/news/',
newsSchema,
true,
)) as IPersonNewsFetchResultEntry[]
const serviceBranches: string[] =
serviceBranch !== undefined
? serviceBranch
: fetchResult
.filter(
(
entry: IPersonNewsFetchResultEntry,
index: number,
array: IPersonNewsFetchResultEntry[],
): boolean => {
return (
entry.niveauID === NewsLevel.ServiceBranch &&
array.findIndex(
(value: IPersonNewsFetchResultEntry): boolean => {
return entry.unitID === value.unitID
},
) === index
)
},
)
.map((entry: IPersonNewsFetchResultEntry): string => {
return entry.unitID
})

现在非常清楚的是,首先对fetchResult进行过滤以删除一些项目,然后对这些项目进行映射以仅返回它们的unitID

从你的问题中很难知道你想要什么逻辑或你的数据是什么样子的。但是,如果希望所有结果,则完全删除filter()调用。如果要返回整个对象而不是仅返回unitID,请完全删除map()调用。如果您想要不同的筛选逻辑,请更改该filter的内部逻辑。

最新更新