【问题标题】:Create a table and calculate sum of each columns创建一个表并计算每列的总和
【发布时间】:2021-02-20 01:11:51
【问题描述】:

我想创建一个类库来处理一些用户输入。用户可以使用列名和逗号分隔值在 UI 中添加列。我想对这些数据进行一些计算并将其呈现在数据表中。更具体地说,计算每个特定列的输入值的总和,而不考虑输入的值的数量,然后计算列的总和。我被困在如何计算数组中每个特定列的总和,然后计算这些列值的总和。非常感谢任何帮助。

// 类

export class DataTable {
    public constructor(id: string) {
        this.id = id;
    }

    public readonly id: string;
    public rowCount: number = 0;
    public columnCount: number = 0;

    public columnName: string;
    public columnValuesAsCsv: string;
    public listOfColumns: any[] = [];
    public listOfValues: any[] = [];

    public addColumn(columnName: string, columnValuesAsCsv: string) {
           this.columnName = columnName;
           this.columnValuesAsCsv = columnValuesAsCsv;

           this.listOfColumns.push(this.columnName);
           while (this.listOfColumns.push()) {
              this.listOfValues.push(this.columnValuesAsCsv);
              break;
           }
           console.log(this.listOfColumns);
           console.log(this.listOfValues);

           this.rowCount = this.listOfValues.length;
           this.columnCount = this.listOfColumns.length; 
    }
    
    public calculateSum(resSum: number, name: any) {
        if (this.columnName !== null && this.columnValuesAsCsv !== null) {
            for (name of this.listOfColumns) {
                //get the sum of column
                resSum = this.listOfValues.reduce((acc: number, item: string) => acc += parseInt(item), 0);
            }
            return resSum;
        }
    }

// UI 的 .ts 文件

import { DataTable } from '../DataTable/DataTable';

export default
    {

        data() {
            return {
                table: new DataTable("ABC"),

                tableId: "",

                columnName: "",

                columnValuesAsCsv: "",

                rowValuesAsCsv: "",

            }
        },
      
        methods:
        {
            onNewTable() {
                console.log(`New Table: ${this.tableId}`);
                // this.table....
            },

            onAddColumn() {
                this.table.addColumn(this.columnName, this.columnValuesAsCsv);
                console.log(this.columnName, this.columnValuesAsCsv);
            },

            onSum() {
                const resSum = this.table.calculateSum();
                console.log(`Sum of column values is: ${name}: ${resSum}`)

            },
        }
    }

listOfColumns[] 的列名 p1,p2 由用户使用表单字段输入。
lisfOfValues[] 的列值分别为 p1 (1,2)、p2 ( 3,4) 由用户使用表单域输入
我正在尝试计算每个 columnName 的总和并将其显示在这样的控制台上:“p1 的总和为:3”、“p2 的总和为:7”等...
最后我想显示:“列的总和是:10”(在这种情况下)。
我希望这能让它更清楚吗?

【问题讨论】:

  • 我不确定我是否完全理解 calculateSum 应该做什么(resSum 是什么?),它应该汇总一个列吗?全桌?还有什么?如果是单列,您可能不需要 for 循环。如果整个表,嵌套reduce 可能会完成这项工作。我的建议是,请创建一个代码框来重现场景以及输入和输出的一些明确定义(例如,给定此数据,返回该值)
  • 我已经用控制台中的 img 更新了我的原始帖子,说明我想要实现什么,希望现在更清楚吗?

标签: typescript algorithm sum


【解决方案1】:

我不确定代码中的某些部分是否意味着其他功能,但我简化了代码以说明这一点。

  • listOfValues 现在是 numbers 的数组,它在 addColumn 上解析,而不是稍后进行奇怪的解析。
  • calculateSum 接受非参数并返回(作为对象)[columnName, columnSum] 的数组和总和。 (totalSumreducereduce)。
class DataTable {
  public constructor(id: string) {
    this.id = id;
  }

  public readonly id: string;
  public rowCount: number = 0;
  public columnCount: number = 0;

  public columnName: string;
  public columnValuesAsCsv: string;
  public listOfColumns: string[] = [];
  public listOfValues: number[][] = [];

  private arraySum(array: number[]) {
    return array.reduce((acc, item) => acc + item, 0);
  }

  public addColumn(columnName: string, columnValuesAsCsv: string) {
    this.listOfColumns.push(columnName);
    this.listOfValues.push(columnValuesAsCsv.split(",").map(Number));
    // this.columnName = columnName;
    // this.columnValuesAsCsv = columnValuesAsCsv;

    // this.listOfColumns.push(this.columnName);
    // while (this.listOfColumns.push()) {
    //   this.listOfValues.push(this.columnValuesAsCsv);
    //   break;
    // }
    // console.log(this.listOfColumns);
    // console.log(this.listOfValues);

    // this.rowCount = this.listOfValues.length;
    // this.columnCount = this.listOfColumns.length;
  }

  // public calculateSum(resSum: number, name: any) {
  public calculateSum() {
    const columnsSum: [string, number][] = this.listOfValues.map(
      (columnValues, index) => [
        this.listOfColumns[index],
        this.arraySum(columnValues)
      ]
    );
    return {
      columnsSum,
      totalSum: this.arraySum(columnsSum.map(([, columnSum]) => columnSum))
    };
  }
  //   if (this.columnName !== null && this.columnValuesAsCsv !== null) {
  //     for (name of this.listOfColumns) {
  //       //get the sum of column
  //       resSum = this.listOfValues.reduce(
  //         (acc: number, item: string) => (acc += parseInt(item)),
  //         0
  //       );
  //     }
  //     return resSum;
  //   }
  // }
}

const dt = new DataTable("id");
dt.addColumn("p1", "1, 2");
dt.addColumn("p2", "3, 4");

const { columnsSum, totalSum } = dt.calculateSum();
columnsSum.forEach(([name, sum]) => console.log(`sum of: ${name} is ${sum}`));
console.log(`total sum of columns is: ${totalSum}`);

https://stackblitz.com/edit/typescript-opp1qz

注意:我会将数据存储在 Map 而不是 2 个单独的数组中,以便在添加、删除和搜索时保持同步。

【讨论】:

  • Brilliant Mosh,你让它看起来如此简单。我需要一步一步来,确保我了解你是如何使用地图的。一个问题。如果您在上面看到,我正在数据对象的 Test.ts 文件中创建我的表,并在 addColumn 方法中添加列名和值,当我为该类实现您的解决方案时,这现在不起作用。当我按下“添加列按钮”时,表单现在不会接受任何输入。不确定如何更改此方法?: onAddColumn() { this.table.addColumn(this.columnName, this.columnValuesAsCsv); },
  • which doesn't work - 控制台有错误吗?究竟是什么行不通?为什么Form will not take any inputs nowaddColumn 还接受参数吗?我重复我的建议,请创建一个 sn-p,你甚至可以分叉我的。以这种方式理解挑战将容易得多
猜你喜欢
  • 1970-01-01
  • 2020-08-13
  • 2022-12-30
  • 2021-12-18
  • 2022-12-15
  • 1970-01-01
  • 2014-06-23
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多