Web前端之Vue+Element实现表格动态不同列合并多行、localeCompare、forEach、table、push、sort、Map


效果图


公共数据

Html

html 复制代码
<el-table :data="tableData" :span-method="changeSpanMethod" border
	style="width: 100%; margin-top: 20px">
	<el-table-column prop="department" label="科室" width="168px"></el-table-column>
	<el-table-column prop="name" label="姓名"></el-table-column>
	<el-table-column prop="amount1" label="特色套餐"></el-table-column>
	<el-table-column prop="amount2" label="价格"></el-table-column>
	<el-table-column prop="amount3" label="菜肴名称"></el-table-column>
	<el-table-column prop="amount4" label="制作物料"></el-table-column>
</el-table>

JavaScript

javascript 复制代码
// 数据
tableData: [{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '米饭',
		amount4: '水70g'
	},
	{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '油豆腐炒肉',
		amount4: '猪里脊20g'
	},
	{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '油豆腐炒肉',
		amount4: '油果50g'
	},
	{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '米饭',
		amount4: '香米50g'
	},
	{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '油豆腐炒肉',
		amount4: '葱花2g'
	},
	{
		department: '急诊大厅',
		name: '王五',
		amount1: '包子铺',
		amount2: '1.50',
		amount3: '水晶包',
		amount4: '肥肉10g'
	},
	{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '油豆腐炒肉',
		amount4: '蒜米5g'
	},
	{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '油豆腐炒肉',
		amount4: '豆油2g'
	}, 
	{
		department: '急诊大厅',
		name: '王五',
		amount1: '包子铺',
		amount2: '1.50',
		amount3: '水晶包',
		amount4: '糖10g'
	},
	{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '油豆腐炒肉',
		amount4: '盐2g'
	},
	{
		department: '急诊大厅',
		name: '张三',
		amount1: '桂林米粉套餐',
		amount2: '5.50',
		amount3: '油豆腐炒肉',
		amount4: '酱油3g'
	},
	{
		department: '急诊大厅',
		name: '李四',
		amount1: '早餐1',
		amount2: '6.00',
		amount3: '小米粥',
		amount4: '香米20g'
	},
	{
		department: '急诊大厅',
		name: '李四',
		amount1: '早餐1',
		amount2: '6.00',
		amount3: '煎蛋',
		amount4: '鸡蛋50g'
	},
	{
		department: '急诊大厅',
		name: '王五',
		amount1: '包子铺',
		amount2: '1.50',
		amount3: '水晶包',
		amount4: '面粉50g'
	},
	{
		department: '急诊大厅',
		name: '李四',
		amount1: '早餐1',
		amount2: '6.00',
		amount3: '小米粥',
		amount4: '水70g'
	},
	{
		department: '急诊大厅',
		name: '李四',
		amount1: '早餐1',
		amount2: '6.00',
		amount3: '煎蛋',
		amount4: '油20g'
	},
	{
		department: '急诊大厅',
		name: '李四',
		amount1: '早餐1',
		amount2: '6.00',
		amount3: '榨菜',
		amount4: '榨菜20g'
	}
],
spanConfig: ['department', 'name', 'amount1', 'amount2', 'amount3'],
spanMap: new Map()

数据未排序时(需要合并的行数据未处于相邻位置)

javascript 复制代码
// 排序方法
groupByKeys(keyLis) {
	let list = this.tableData;
	let res = list.sort((a, b) => {
		// localeCompare汉字排序
		const sor1 = b[keyLis[0]].localeCompare(a[keyLis[0]], 'zh');

		if (sor1 !== 0) return sor1;
		return a[keyLis[1]].localeCompare(b[keyLis[1]], 'zh');
	});

	this.tableData = res;
}

固定合并行(写死)

javascript 复制代码
changeSpanMethod({
	row,
	column,
	rowIndex,
	columnIndex
}) {
	if (columnIndex === 0) {
		if (rowIndex === 0) {
			return {
				rowspan: 11,
				colspan: 1
			};
		} else {
			return {
				rowspan: 0,
				colspan: 0
			};
		}
	}
	if (columnIndex === 1) {
		if (rowIndex === 0) {
			return {
				rowspan: 8,
				colspan: 1
			};
		} else if (rowIndex === 8) {
			return {
				rowspan: 3,
				colspan: 1
			};
		} else {
			return {
				rowspan: 0,
				colspan: 0
			};
		}
	}
	if (columnIndex === 2) {
		if (rowIndex === 0) {
			return {
				rowspan: 8,
				colspan: 1
			};
		} else if (rowIndex === 8) {
			return {
				rowspan: 3,
				colspan: 1
			};
		} else {
			return {
				rowspan: 0,
				colspan: 0
			};
		}
	}
	if (columnIndex === 3) {
		if (rowIndex === 0) {
			return {
				rowspan: 8,
				colspan: 1
			};
		} else if (rowIndex === 8) {
			return {
				rowspan: 3,
				colspan: 1
			};
		} else {
			return {
				rowspan: 0,
				colspan: 0
			};
		}
	}
	if (columnIndex === 4) {
		if (rowIndex === 0) {
			return {
				rowspan: 1,
				colspan: 1
			};
		} else if (rowIndex === 1) {
			return {
				rowspan: 7,
				colspan: 1
			};
		} else if (rowIndex >= 2 && rowIndex <= 7) {
			return {
				rowspan: 0,
				colspan: 0
			};
		} else {
			return {
				rowspan: 1,
				colspan: 1
			};
		}
	}
}

动态合并行

javascript 复制代码
// 合并行数计算
calculateSpans() {
	const spanConfig = this.spanConfig;
	const tempMap = new Map();

	spanConfig.forEach(prop => {
		const spans = [];
		let position = 0;

		this.tableData.forEach((item, index) => {
			if (index === 0) {
				spans.push(1);
				position = 0;
			} else {
				// 当前行内容与上一行相同
				if (this.tableData[index][prop] === this.tableData[index - 1][prop]) {
					spans[position] += 1;
					spans.push(0);
				} else {
					spans.push(1);
					position = index;
				}
			}
		});
		tempMap.set(prop, spans);
	});
	this.spanMap = tempMap;
},
// 合并方法
changeSpanMethod({
	column,
	rowIndex
}) {
	const spanConfig = this.spanConfig;
	const config = spanConfig.find(item => item === column.property);

	if (!config) return {
		rowspan: 1,
		colspan: 1
	};

	const spans = this.spanMap.get(config);

	if (!spans) return {
		rowspan: 1,
		colspan: 1
	};

	return {
		rowspan: spans[rowIndex],
		colspan: spans[rowIndex] > 0 ? 1 : 0
	};
}

方法(函数)执行

javascript 复制代码
// 注:一下两个方法执行顺序不能颠倒
// 排序方法执行(如果不需要排序,那就不用执行排序方法)
this.groupByKeys(['name', 'amount3']);
// 计算合并行方法执行
this.calculateSpans();
相关推荐
仙人球部落4 分钟前
-python-LangGraph框架(3-31-LangGraph 「合并式状态管理」的原理与实践)
开发语言·javascript·python
2601_9637713731 分钟前
Hardening Enterprise WordPress Sites Against REST API Leaks and Bad Headers
前端·windows·word·php
蓝银草同学34 分钟前
Stream 实战:博客列表排序、过滤与分页(AI 辅助学习 Java 8)
java·前端·后端
2601_9571909042 分钟前
飞行影院安装施工指南:场地、动感系统与影片内容配套
大数据·前端·人工智能
爱折腾的小黑牛42 分钟前
简记往来批量录入功能的实现:从文本到结构化数据
前端·算法
sunfdf1 小时前
Next.js 新手从零部署到首跑实战指南
开发语言·javascript·ecmascript
YHHLAI1 小时前
Agent 智能体开发实战 · 第六课:MCP 协议 —— 让 Agent 跨进程调用工具
前端·人工智能
SmartBoyW1 小时前
前端死磕:一文彻底搞懂 JS 事件循环 (Event Loop) 与宏微任务
前端·javascript
爱勇宝2 小时前
3位工程师靠“删AI代码”创业,一周收费1万美元:以后最贵的能力,可能不是写代码
前端·后端·架构
Curvatureflight2 小时前
客户端日志上报怎么设计?让线上问题不再只靠用户截图
前端·系统架构