当前位置: 首页 > 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.说…...

2024 年 MathorCup 数学应用挑战赛——大数据竞赛-赛道 A:台风的分类与预测

2024年MathorCup大数据挑战赛-赛道A初赛--思路https://download.csdn.net/download/qq_52590045/89922904↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓…...

kotlin实现viewpager

说明:kotlin tablayout viewpager adapter实现滑动界面 效果图 step1: package com.example.flushfragmentdemoimport androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.…...

RabbitMQ最新版本4.0.2在Windows下的安装及使用

RabbitMQ 是一个开源的消息代理和队列服务器,提供可靠的消息传递和队列服务。它支持多种消息协议,包括 AMQP、STOMP、MQTT 等。本文将详细介绍如何在 Windows 系统上安装和使用最新版本的 RabbitMQ 4.0.2。 前言 RabbitMQ 是用 Erlang 语言开发的 AMQP&…...

东方博宜1180 - 数字出现次数

问题描述 有 50 个数( 0∼19),求这 50个数中相同数字出现的最多次数为几次? 输入 50 个数字。 输出 1 个数字(即相同数字出现的最多次数)。 样例 输入 1 10 2 0 15 8 12 7 0 3 15 0 15 18 16 7 17 16 9 …...

LeetCode: 3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2,代表 8 x 8 国际象棋棋盘上的两个方格的坐标。   以下是棋盘的参考图。   如果这两个方格颜色相同,返回 true,否则返回 false。   坐标总是表示有效的棋盘方格。坐标的格式总是先…...

datax编译并测试

mvn -U clean package assembly:assembly -Dmaven.test.skiptrue 参看:DataX导数的坑_datax插件初始化错误, 该问题通常是由于datax安装错误引起,请联系您的运维解决-CSDN博客 两边表结构先创建好: (base) [rootlnpg bin]# pwd /db/DataX-datax_v20230…...

2-133 基于matlab的粒子群算法PSO优化BP神经网络

基于matlab的粒子群算法PSO优化BP神经网络,BP神经网络算法采用梯度下降算法,以输出误差平方最小为目标,采用误差反向传播,训练网络节点权值和偏置值,得到训练模型。BP神经网络的结构(层数、每层节点个数)较复杂时&…...

复盘秋招22场面试(四)形势重新评估与后续措施

连续好多天睡不着觉,经常晚上起来好几次,到现在还是没offer。之前有个校友在抖音留言说我能收到这么多面试说明简历没问题,这么多一面挂,说明我技术面有问题。确实有一些是kpi面,但是我复盘之后我发现也没有那么多kpi面…...

揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器

目录 🚀0.前言 🚈1.string 构造函数 🚝1.1string构造函数 🚝1.2string拷贝构造函数 🚈2.string类的使用 🚝2.1.查询元素个数或空间 返回字符串中有效字符的个数:size lenth 返回字符串目…...

用人工智能,应该怎么掏钱?

人工智能(AI)服务的发展正快速改变企业和开发者的工作方式,不仅提供了强大的数据分析和预测能力,还涵盖了从自然语言处理到图像识别的广泛功能。然而,理解AI服务的支付模式对成本控制和合理资源分配至关重要&#xff0…...

无锡专业做网站建设/百度售后服务电话

在我们平常的编码中,通常会将一些对象保存起来,这主要考虑的是对象的创建成本。比如像线程资源、数据库连接资源或者 TCP 连接等,这类对象的初始化通常要花费比较长的时间,如果频繁地申请和销毁,就会耗费大量的系统资源…...

ppt设计大赛/开封网站seo

D. Equal Binary Subsequences 一道比较妙的构造题 我们只需要成对进行考虑即可&#xff0c;每一个成对的01和10反着操作即可 void solve(){int cnt10;cin>>n;cin >> p;p" "p;n*2;vector<pii> vec;for(int i1;i<n;i2){if(p[i]!p[i1]){if(p[i]…...

网站图片列表怎么做/seo排名优化厂家

音频处理主要适用于基于声音的处理、分析和建模&#xff0c;而Python作为当前最流行的编程语言之一&#xff0c;在音频处理方面也提供了大量的库和框架&#xff0c;本文整理了其中12个常用音频处理库&#xff0c;以供学习研究之用。1、eyeD3eyeD3是一个处理音频文件的Python工具…...

wordpress 多备份/东莞关键词排名推广

3.11 sort&#xff1a;文本排序 3.11.1 命令详解 ​ 【命令星级】 ★★★★★ ​ 【功能说明】 ​ sort命令将输入的文件内容按照指定的规则进行排序&#xff0c;然后将排序结果输出。 ​ 【语法格式】 sort [option] [file] sort [选项] [文件]​ **说明&#xff1a;**在…...

上海 房地产网站建设/百度网盘帐号登录入口

此代码在我的本地xampp apache服务器中工作正常。 我在具有不同IP地址系统的局域网中运行相同的代码。 该文件无法打开&#xff0c;我无法将其写入所需的目录。 请做有需要的吗&#xff1f; 提前致谢。通过下面的代码传递xml文件。#!"C:\xampp\perl\bin\perl.exe"#!&…...

怎么打造自己的网站/长沙网站制作费用

httprunner3.x版本的接入了pytest框架&#xff0c;所以可以使用pytest所有的插件&#xff1b;对比httprunner2.x的报告展示各有优缺点&#xff0c;个人觉得2.x的报告还是挺不错的&#xff0c;看起来也很舒服的。 测试报告生成&#xff1a; 首先就是html报告&#xff1a;这个插…...