在typecript中删除对字符串数组的过滤。

问题描述 投票:0回答:1

如果有人能帮助我,那将是非常感激的:)。我一直在为typescript的语法而苦恼(这里是初学者)。

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

谢谢你的帮助。

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;
    }));
typescript typescript2.0
1个回答
0
投票

为什么所有的东西都有显式类型,有什么原因吗?

是不是因为 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)
}


0
投票

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

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.

© www.soinside.com 2019 - 2024. All rights reserved.