在打字稿中删除字符串数组上的过滤器

时间:2020-05-11 20:15:38

标签: typescript typescript2.0

如果有人可以帮助我,将不胜感激:)。 我一直在为typescript的语法而苦苦挣扎(这里是初学者)。

我需要重构此代码,以便获得serviceBranches的完整列表。 正确地进行了一些过滤和映射,并且从我们的API返回了一个serviceBranch。 我已经尝试删除一些过滤器,但可能不是正确的过滤器。 有人可以帮助我获取所有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;
    }));

2 个答案:

答案 0 :(得分: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的地方。

从您的问题中很难知道您想要什么逻辑或数据看起来像什么。但是,如果要获得 all 结果,则可以完全删除filter()调用。如果要返回整个对象而不是仅返回unitID,请完全删除map()调用。如果要使用其他过滤逻辑,请更改该filter的内部逻辑。

答案 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)
}