首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算某一群类型的所有测度之和

计算某一群类型的所有测度之和
EN

Code Review用户
提问于 2020-10-14 16:32:07
回答 1查看 47关注 0票数 2

我有一种方法可以接收两个params:

  • 第一个是类型为{ group1: string,group2: string,度量值: number,.}的对象数组。
  • 第二个是字符串。

我还有一个枚举GroupColumns

代码语言:javascript
复制
enum GroupColumns {
  ColumnTypeX = 'Column Type X',
  ColumnTypeY = 'Column Type Y',
  ColumnTypeZ = 'Column Type Z'
}

当第二个参数匹配第二个组时,当第一个组等于GroupColumns枚举中的任何组时,该方法计算特定组类型的所有度量的总和。

代码语言:javascript
复制
    private ComputeSpecificColumnMeasure(data: Array<IDynamic<any>>, groupType: String): number {
        let measure: number = 0;
        data.forEach(el => {
            if (el.group2 === groupType && (el.group1 === GroupColumns.ColumnTypeX || el.group1 === GroupColumns.ColumnTypeY || el.group1 === GroupColumns.ColumnTypeZ )) {
                measure += el.measure;
            }
        });

        return measure;
    }

我不喜欢里面的核查。如果我想要添加更多的列(不太可能),我需要展开它,或者创建另一个方法来检查group1是否等于任何GroupColumns。

有什么意见吗?

如何使这段代码可伸缩和优化

EN

回答 1

Code Review用户

回答已采纳

发布于 2020-10-14 16:53:45

如果可能的话,我会将GroupColumns改为数组。这样,您所需要做的就是使用.includes来查看条目是否包含在其中。其他改进可包括:

如果可能,让TS自动推断类型。您只需要表示一个变量的类型或返回值的类型,当TS不能单独这样做的时候。TS可以自动确定ComputeSpecificColumnMeasure返回一个数字。它还可以确定measure将是一个数字,因此不需要表示其中任何一个的类型。

避免字符串类型" String“类型是通过字符串构造函数(如const str = new String('data'); )创建的。这几乎不是您想要的-对于一个普通的字符串,使用string (原语)类型代替。(TSLint规则:ban-types)

避免any你有data: Array<IDynamic<any>>。应该尽可能避免在any中使用TypeScript,因为它非常灵活--它失去了类型安全性。如果您不知道类型是什么,请使用unknown,它是类型安全的。

关于any问题的一个小例子:

代码语言:javascript
复制
const fn = (arg: any) => {
    console.log(arg.toFixed(2));
}

这不会引发TS错误,但除非传递的参数恰好是数字,否则很可能引发运行时错误。相反,使用unknown会引发TS错误--它将迫使您在调用特定方法之前先缩小类型。

代码语言:javascript
复制
const fn = (arg: unknown) => {
    if (typeof arg === 'number') {
        console.log(arg.toFixed(2));
    }
}

即使函数中没有使用any的值,在可能的情况下也最好避免使用any。(TSLint规则:no-unsafe-any)

按照惯例,大写化中只有少数东西在JS中使用PascalCase:

  • 名称空间(如React)
  • 恩纳姆,有时

普通的方法可能应该使用标准的camelCase代替。

代码语言:javascript
复制
const groupColumns = [
    'Column Type X',
    'Column Type Y',
    'Column Type Z'
] as const; // Use "as const" to prevent automatic widening to `string[]`

private computeSpecificColumnMeasure(data: Array<IDynamic<unknown>>, groupType: string) {
    let measure = 0;
    data.forEach(el => {
        if (el.group2 === groupType && groupColumns.includes(el.group1)) {
            measure += el.measure;
        }
    });
    return measure;
}

或者,如果您愿意,可以使用.filterreduce

代码语言:javascript
复制
private computeSpecificColumnMeasure(data: Array<IDynamic<unknown>>, groupType: string) {
    return data
        .filter(el => el.group2 === groupType && groupColumns.includes(el.group1))
        .reduce((measureSoFar, el) => measureSoFar + el.measure, 0);
}
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/250666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档