当前位置: 首页 > news >正文

根据用户选择的行和列数据构造数据结构(跨行跨列)

方案一

这段代码的功能是根据用户选择的行和列数据,生成一个适合复制粘贴的字符串表格。代码会先按列的 id 从小到大排序,再根据行列的选择关系将数据按顺序填入表格,每行之间使用换行符分隔,每列之间使用制表符分隔。如果某一行缺少对应列的数据,则在该位置插入空格。

注意事项

  1. 列排序:代码先根据 id 对所选列数据进行排序,确保生成的表格中列顺序一致。
  2. 行列对应关系:每列数据包含一个 _X_ROW_KEY 属性,表示它对应的行。代码会检查列和行的 _X_ROW_KEY 是否匹配,只有匹配的列才会填入数据,否则填入空位。
  3. 空位占位:如果某行在某列没有数据,为了保持列对齐,会插入空字符串。

代码字段解释

  • selectedRows:用户选择的行数据,每行数据代表一个完整的数据对象,其中包含了字段 idnamesex 等字段,并用 _X_ROW_KEY 标记它属于哪一行。
  • selectedColumns:用户选择的列数据,每列包含 field(对应行的字段)、title(列标题)、id(列的唯一标识)等属性。_X_ROW_KEY 数组标记该列在哪些行中有数据。
  • sortedColumns:排序后的列数组,确保列输出时按 id 的升序排列。

代码实现

// 所选行数据
const selectedRows = [{ "id": 1, "name": "张三", "age": 30, "sex": "男", "job": "前端", "address": "中国xxxxxxxxxx", "_X_ROW_KEY": "row_8" },{ "id": 2, "name": "李四", "age": 30, "sex": "男", "job": "后端", "address": "中国xxxxxxxxxx", "_X_ROW_KEY": "row_10" }
];// 所选列数据
const selectedColumns = [{ "property": "name", "field": "name", "title": "姓名", "width": 100, "fixed": "left", "align": "left", "filterMultiple": true, "id": "col_09", "_X_ROW_KEY": ["row_8"] },{ "property": "job", "field": "job", "title": "职务", "width": 100, "fixed": "left", "align": "left", "filterMultiple": true, "id": "col_34", "_X_ROW_KEY": ["row_10"] },{ "property": "address", "field": "address", "title": "地址", "width": 100, "fixed": "left", "align": "left", "filterMultiple": true, "id": "col_35", "_X_ROW_KEY": ["row_10","row_8"] },{ "property": "sex", "field": "sex", "title": "性别", "width": 100, "fixed": "left", "align": "left", "filterMultiple": true, "id": "col_10", "_X_ROW_KEY": ["row_8","row_10"] }
];// 组装数据结构并生成拼接字符串
function assembleSelectedDataString(selectedRows, selectedColumns) {// 对 selectedColumns 按列的 id 从小到大排序,确保输出中列的顺序一致const sortedColumns = selectedColumns.sort((a, b) => parseInt(a.id.replace("col_", "")) - parseInt(b.id.replace("col_", "")));// 初始化一个空数组,用来存储每一行的拼接数据const rows = [];// 遍历行数据,对每一行处理一次selectedRows.forEach(row => {const rowKey = row._X_ROW_KEY; // 获取当前行的唯一标识符,用来匹配列数据const rowData = []; // 存储当前行对应的每列数据// 遍历排序后的列数据,保证列顺序输出正确sortedColumns.forEach(column => {// 检查当前列是否包含该行数据的 _X_ROW_KEYif (column._X_ROW_KEY.includes(rowKey)) {// 如果列的 _X_ROW_KEY 包含当前行的 rowKey,则插入对应的字段值rowData.push(row[column.field]);} else {// 如果不包含,则插入空字符串,占位使列对齐rowData.push("");}});// 将当前行数据(用制表符连接每列数据)添加到 rows 数组中rows.push(rowData.join("\t"));});// 将所有行数据连接成一个字符串,每行之间用换行符分隔return rows.join("\n");
}// 调用函数获取拼接后的字符串
const selectedDataString = assembleSelectedDataString(selectedRows, selectedColumns);
console.log(selectedDataString);

示例输出

张三	男		中国xxxxxxxxxx男	后端	中国xxxxxxxxxx

方案二

这段代码的目的是根据输入的行数据和列数据生成一个格式化的字符串,字符串中的列使用制表符 (\t) 分隔,行使用换行符 (\n) 分隔,方便输出和阅读。每一列的数据会根据最大列宽对齐,以确保输出的格式整齐。

const data = [{ "rowIndex": 2, "columnIndex": 5, "value": "2218123959094757194" },{ "rowIndex": 2, "columnIndex": 6, "value": "2-6" },{ "rowIndex": 3, "columnIndex": 5, "value": "2218123959094757194" },{ "rowIndex": 3, "columnIndex": 6, "value": "3-6" },{ "rowIndex": 4, "columnIndex": 5, "value": "2218123959094757194" },{ "rowIndex": 4, "columnIndex": 6, "value": "4-6" },{ "rowIndex": 5, "columnIndex": 5, "value": "2218123959094757194" },{ "rowIndex": 5, "columnIndex": 6, "value": "5-6" },{ "rowIndex": 6, "columnIndex": 5, "value": "2218123959094757194" },{ "rowIndex": 7, "columnIndex": 7, "value": "7-7-7-7-7-7" },{ "rowIndex": 7, "columnIndex": 8, "value": "7-8-7-8-7-8" },
];// 定义一个函数,用于生成格式化的表格字符串
function generateCompactTableString(data) {// 计算表格的最大行索引const maxRow = Math.max(...data.map(item => item.rowIndex));// 提取所有列索引并去重、排序,得到一个有序的列索引数组const columnIndices = Array.from(new Set(data.map(item => item.columnIndex))).sort((a, b) => a - b);// 创建一个二维数组,用于存储每个单元格的内容// 行数为 maxRow + 1,列数为 columnIndices 的长度,初始化为空字符串const table = Array.from({ length: maxRow + 1 }, () => Array(columnIndices.length).fill(""));// 遍历输入数据,将值填入对应的表格位置data.forEach(item => {const { rowIndex, columnIndex, value } = item; // 解构出行索引、列索引和值const colIndex = columnIndices.indexOf(columnIndex); // 找到列索引在表格中的位置if (colIndex !== -1) { // 如果该列索引存在table[rowIndex][colIndex] = value; // 将值填入表格}});// 计算每列的最大宽度,以便后续对齐const columnWidths = columnIndices.map((_, colIndex) => Math.max(...table.map(row => row[colIndex].length)) // 计算每列的最大字符长度);// 过滤掉空行const nonEmptyRows = table.filter(row => row.some(cell => cell !== "")); // 只保留至少有一个非空单元格的行// 将表格内容转换为字符串,用制表符分隔列return nonEmptyRows.map(row => row.map((cell, colIndex) => cell.padEnd(columnWidths[colIndex]) // 确保每列宽度一致,使用空格填充).join("\t") // 用制表符连接列).join("\n"); // 用换行符连接行
}// 输出格式化后的表格字符串
const compactTableString = generateCompactTableString(data);
console.log(compactTableString); // 打印输出结果

各字段解释

  1. data:一个包含多个对象的数组。每个对象代表一个单元格的数据,包含以下字段:

    • rowIndex:表示数据所在的行索引(从0开始计数)。
    • columnIndex:表示数据所在的列索引(从0开始计数)。
    • value:该单元格要显示的内容。
  2. generateCompactTableString(data):一个函数,用于生成格式化的表格字符串。

    • 参数data,上面定义的数组。
    • 返回值:格式化后的表格字符串,列用制表符分隔,行用换行符分隔。
  3. maxRow:通过遍历 data 数组,找出最大的 rowIndex 值,以确定表格的行数。

  4. columnIndices:使用 Set 来提取并去重所有的 columnIndex,然后将其排序,得到一个有序的列索引数组。

  5. table:一个二维数组,用于存储每个单元格的内容。它的行数为 maxRow + 1,列数为 columnIndices 的长度,初始时填充为空字符串。

  6. padEnd:用于确保每列的宽度一致,通过在每个单元格内容后面填充空格。

相关文章:

根据用户选择的行和列数据构造数据结构(跨行跨列)

方案一 这段代码的功能是根据用户选择的行和列数据,生成一个适合复制粘贴的字符串表格。代码会先按列的 id 从小到大排序,再根据行列的选择关系将数据按顺序填入表格,每行之间使用换行符分隔,每列之间使用制表符分隔。如果某一行…...

Spark教程5-基本结构化操作

加载csv文件 df spark.read.format("json").load("/data/flight-data/json/2015-summary.json")Schema 输出Schema df.printSchema()使用Schema读取csv文件,以指定数据类型 from pyspark.sql.types import StructField, StructType, Strin…...

内置数据类型、变量名、字符串、数字及其运算、数字的处理、类型转换

内置数据类型 python中的内置数据类型包括:整数、浮点数、布尔类型(以大写字母开头)、字符串 变量名 命名变量要见名知意,确保变量名称具有描述性和意义,这样可以使得代码更容易维护,使用_可以使得变量名…...

Win/Mac/Android/iOS怎麼刪除代理設置?

設置代理設置的主要構成 IP 地址和端口 這些是代理伺服器配置的最基本組件。代理伺服器的IP地址引導互聯網流量,而端口號指定伺服器上的通信通道。 為什麼要刪除代理設置? 刪除代理設置通常是為了解決網路問題、提高速度、恢復安全性或過渡到新的網路…...

数据结构------手撕顺序表

文章目录 线性表顺序表的使用及其内部方法ArrayList 的扩容机制顺序表的几种遍历方式顺序表的优缺点顺序表的模拟实现洗牌算法 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,…...

UDP(用户数据报协议)端口监控

随着网络的扩展,确保高效的设备通信对于优化网络功能变得越来越重要。在这个过程中,端口发挥着重要作用,它是实现外部设备集成的物理连接器。通过实现数据的无缝传输和交互,端口为网络基础设施的顺畅运行提供了保障。端口使数据通…...

【Java小白图文教程】-05-数组和排序算法详解

精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…...

OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集,以提…...

Lucas带你手撕机器学习——套索回归

好的,下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用,同时还会讨论其优缺点和一些常见问题。 套索回归(Lasso Regression) 1. 背景与动机 在机器学习和统计学中,模型的复杂性通常会影响其在…...

面试中的一个基本问题:如何在数据库中存储密码?

面试中的一个基本问题:如何在数据库中存储密码? 在安全面试中,“如何在数据库中存储密码?”是一个基础问题,但反映了应聘者对安全最佳实践的理解。以下是安全存储密码的最佳实践概述。 了解风险 存储密码必须安全&am…...

XML HTTP Request

XML HTTP Request 简介 XMLHttpRequest(XHR)是一个JavaScript对象,它最初由微软设计,并在IE5中引入,用于在后台与服务器交换数据。它允许网页在不重新加载整个页面的情况下更新部分内容,这使得网页能够实现动态更新,大大提高了用户体验。虽然名字中包含“XML”,但XML…...

TLS协议基本原理与Wireshark分析

01背 景 随着车联网的迅猛发展,汽车已经不再是传统的机械交通工具,而是智能化、互联化的移动终端。然而,随之而来的是对车辆通信安全的日益严峻的威胁。在车联网生态系统中,车辆通过无线网络与其他车辆、基础设施以及云端服务进行…...

当遇到 502 错误(Bad Gateway)怎么办

很多安装雷池社区版的时候,配置完成,访问的时候可能会遇到当前问题,如何解决呢? 客户端,浏览器排查 1.刷新页面和清除缓存 首先尝试刷新页面,因为有时候 502 错误可能是由于网络临时波动导致服务器无法连…...

学习记录:js算法(七十五): 加油站

文章目录 加油站思路一思路二思路三思路四思路五 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xf…...

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-LSTM(集合经验模态分解-多尺…...

yarn的安装与使用以及与npm的区别(安装过程中可能会遇到的问题)

一、yarn的安装 使用npm就可以进行安装 但是需要注意的一点是yarn的使用和node版本是有关系的必须是16.0以上的版本。 输入以下代码就可以实现yarn的安装 npm install -g yarn 再通过版本号的检查来确定,yarn是否安装成功 yarn -v二、遇到的问题 1、问题描述…...

大数据行业预测

大数据行业预测 编译 李升伟 和所有预测一样,我们必须谨慎对待这些预测,因为其中一些预测可能成不了事实。当然,真正改变游戏规则的创新往往出乎意料,甚至让最警惕的预言家也措手不及。所以,如果在来年发生了一些惊天…...

可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式

可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式 前言 在我使用nextron(nextelectron)写了一个项目后打包发现nextron等一系列桌面端框架在生产环境是不支持next的ssr也就是api route功能的这就导致我非常难受&…...

二百七十、Kettle——ClickHouse中增量导入清洗数据错误表

一、目的 比如原始数据100条,清洗后,90条正确数据在DWD层清洗表,10条错误数据在DWD层清洗数据错误表,所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是,Hive中原本的SQL语句,放在ClickHouse…...

CentOS6升级OpenSSH9.2和OpenSSL3

文章目录 1.说明2.下载地址3.升级OpenSSL4.安装telnet 服务4.1.安装 telnet 服务4.2 关闭防火墙4.2.使用 telnet 连接 5.升级OpenSSH5.1.安装相关命令依赖5.2.备份原 ssh 配置5.3.卸载原有的 OpenSSH5.4.安装 OpenSSH5.5.修改 ssh 配置文件5.6关闭 selinux5.7.重启 OpenSSH 1.说…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...