JS宏实例:数据透视工具的制作(三)

数据透视工具的制作(二)中详细展示了窗体设计思路及想要实现的功能,在本节中,将完成该工具中的核心计算代码,如分组求和、计数、累乘等的实现方式。

在这里,我们可以构思两个类:

  • TablePivot:主要用于管理数据矩阵,包括自动识别列数据类型,以及实现数据分组功能。
  • GroupBy:对分组后的数据进行各种统计操作,例如求和、计数、求平均值等。

一、TablePivot类

1、示例代码

class TablePivot {
	
	constructor(data) {
		// data是一个矩阵,第一行是标题行
		this.#_matrix = data;
	}
	
	get data() {
		// 处理重复的标题
		let title = this.#_matrix[0].reduce((set, item, index) => {
			if (set.has(item)) {
				set.add(item + "_" + index);
			} else {
				set.add(item);
			}
			return set;
		}, new Set());
		this.#_matrix[0] = Array.from(title);
		return this.#_matrix;
	}
	
	get title() {
		return this.data[0];
	}
	
	set data(value) {
		this.#_matrix = data;
	}
	
	// 自动识别数据类型
	identifyColType(matrix) {
		// matrix:是一个矩阵,第一行是标题行,返回除开标题行意外所有列的数据类型(如果整列的数据类型为number,那么该列数据类型才是number)
		if (matrix == undefined) matrix = this.data;
		let title = matrix[0];
		let colTypes = title.map(i => new Set()); 
		for (let rowIndex = 1; rowIndex < matrix.length; rowIndex++) {
			let row = matrix[rowIndex];
			for (let columnIndex = 0; columnIndex < row.length; columnIndex++) {
				let type = typeof row[columnIndex];
				colTypes[columnIndex].add(type);
			}
		}
		// 以二维数组的形式返回对应的类型
		let result = [["字段名称", "字段类型"]];
		for (let i = 0; i < colTypes.length; i++) {
			let type = colTypes[i];
			let temp = [title[i]];
			if (type.size > 1) {
				temp.push("任意");
			} else if (type.has("string")) {
				temp.push("文本");
			} el

你可能感兴趣的:(JS宏实例,javascript,前端,java)