首页 > 解决方案 > 修复返回之外的 Typescript 函数

问题描述

我正在开发一个已经创建的 NodeJS 和 Typescript 项目,并且有一个功能我不太了解它是如何工作的,我不相信它做得很好。

该函数负责比较两个对象并提取仅在第一个对象中找到的信息,尽管我真的不知道如何。

该函数的所有逻辑都在 return 内部,我想知道如何将其取出并以更易于理解的方式制作。

这是功能:

public async objectComparer(fstArr: any, secArr: any) {

      try {

          return Promise.resolve( (current: any) => {
              return (
                fstArr.filter((secArr: any) => {
                  return secArr.fileName == current.fileName;
                }).length == 0
              );
          });
          
      } catch (error) {
          return Promise.reject(error);
      }
      
    }

我递给他两个东西:

let obj1 = [ 
    { codCountry: 'CO', fileName: 'CO_SER.txt' },
    { codCountry: 'CO', fileName: 'CO_TES.txt' } ];

let obj2 = [ 
    { codCountry: 'CO', fileName: 'CO_SER.txt' },
    { codCountry: 'CO', fileName: 'CO_DAT.txt' } ];

我运行函数:

let onlyObj1 = obj1.filter(await this.objectComparer(obj2, obj1));

这就是它返回的内容:

let objReturn = [ { codCountry: 'CO', fileName: 'CO_TEST.csv' } ];

标签: node.jsarraystypescriptfilter

解决方案


这是令人难以置信的扭曲代码。您的代码中的结果将是

let objReturn = [ { codCountry: 'CO', fileName: 'CO_TES.csv' } ];

不是

let objReturn = [ { codCountry: 'CO', fileName: 'CO_TEST.csv' } ];

(注意最后一个 T 差异)。

据我所知,目前尚不清楚这段代码的目的是什么。让我们假设它正在过滤第一个数组中存在但第二个数组中没有的对象。您可以通过以下步骤简化此操作:

  • 声明一个类型 Country 以真正使用 Typescript 功能:
type Country = {
    codCountry: string, fileName: string
}
  • 删除 async/await,因为在这种情况下您不需要它们

  • 以这种方式简化对象比较器:

public presenceInFirstArrayButNotInSecond = (fstArr: Array<Country>, sndArr: Array<Country>) => {
        return fstArr.filter(
            fstElem => sndArr.filter(
                sndElem => sndElem.fileName == fstElem.fileName
            ).length == 0
        );
    }

并这样称呼它:

let onlyObj = this.filter(obj1, obj2);

那应该给你同样的结果

let objReturn = [ { codCountry: 'CO', fileName: 'CO_TES.csv' } ];

推荐阅读