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

news2024/11/24 1:03:04

方案一

这段代码的功能是根据用户选择的行和列数据,生成一个适合复制粘贴的字符串表格。代码会先按列的 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_KEY
      if (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:用于确保每列的宽度一致,通过在每个单元格内容后面填充空格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程

文章目录 前言1. 第一步:编写汇编源程序2. 第二步:对源程序进行编译连接3. 第三步:执行可执行文件中的程序结语 前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程…

多元线性回归【正规方程/sklearn】

多元线性回归【正规方程/sklearn】 1. 基本概念1.1 线性回归1.2 一元简单线性回归1.3 最优解1.4 多元线性回归 2. 正规方程求最优解2.1 线性回归的损失函数(最小二乘法)2.2 推导正规方程2.3 正规方程练习2.4 使用sklearn计算多元线性方程2.5 凸函数 3. 线…

比例数据可视化(Python实现板块层级图绘制)——Instacart Market Basket Analysis

【实验名称】 实验一:绘制板块层级图 【实验目的】 1. 掌握数据文件读取 2. 掌握数据处理的方法 3. 实现板块层级图的绘制 【数据介绍】Instacart Market Basket Analysis 1. 数据说明 数据共有300 0000orders, 20 0000users, …

electron 打包

安装及配置 安装electron包以及electron-builder打包工具 # 安装 electron cnpm install --save-dev electron # 安装打包工具 cnpm install electron-builder -D 参考的package.json文件 其中description和author为必填项目 {"name": "appfile",&qu…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是:123456; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句,会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

C# 创建型设计模式----工厂模式

1 、什么是工厂模式 简单来说就是由一个对象去生成不同的对象,工厂模式是用工厂方法代替new操作的一种模式。工厂方法封装了多个相关联类的new方法,每次实例化这些类的时候不需要new多次,只需要调用工厂类的对应方法即可实例化这些类&#x…

2024年项目管理新风向:敏捷开发与瀑布开发,哪个更优?

一、项目管理的多样格局 2024 年,项目管理领域展现出丰富多样的格局。数字化趋势愈发明显,项目管理软件普及度不断提高,据相关资料显示,随着云计算、大数据等技术的成熟,项目管理软件将更加普及,实现项目信…

单片机_RTOS__架构概念

经典单片机程序 void main() {while(1){函数1();函数2();}} 有无RTOS区别 裸机 RTOS RTOS程序 喂饭() {while(1){喂一口饭();} } …

容灾与云计算概念

​​​​​​基础知识容灾备份——备份技术系统架构与备份网络方案-CSDN博客 SAN,是storage area network的简称,翻译过来就是存储区域网络。 顾名思义,SAN首先是一个网络,其次它是关于存储的,区域则是指服务器和存储资…

【C语言】控制台学生成绩管理系统

文章目录 C语言编程:学生成绩管理系统一、程序概述二、代码实现三、程序解释 C语言编程:学生成绩管理系统 在这篇文章中,我们将一起探讨如何使用C语言来创建一个简单的学生成绩管理系统。这个系统将允许用户输入学生数量、学号和成绩&#x…

气膜娱乐馆:科技与自然的完美结合—轻空间

在这片拥有独特滨海风光和丰富旅游资源的地方,气膜娱乐馆应运而生,为游客和当地居民打造了一个集运动、娱乐、亲子游乐和科技互动于一体的综合性室内娱乐体验。 灵活空间,舒适体验 气膜结构为娱乐馆提供了广阔的空间灵活性,使其能…

【Markdown速成】半小时入门Markdown教程(后缀.md文件详解)

目录 一.认识Markdown Markdown Typora 二.Typora设置 三.Markdown语法 1.标题 2.正文 2.1分割线 2.2删除线 2.3下划线 2.4斜体 2.5粗体 2.6斜粗体 2.7高亮 2.8字体属性(大小及颜色) 2.9对齐方式 2.10引用 3.列表 有序列表 无序列表 …

steam新品节!GameViewr远程随时随地手机平板玩主机游戏教程

Steam平台在10月14日迎来了新品节,你可以尝试即将推出的游戏的免费试用版,将他们加入愿望单,像是《迷失之径》《贪婪大地》《疯狂手机大亨》等等。不知道大家是否已经选择好自己心怡的游戏呢?要是你想随时随地体验steam新品节的游…

大一物联网要不要转专业,转不了该怎么办?

有幸在2014年,踩中了物联网的风口,坏消息,牛马的我,一口汤都没喝上。 依稀记得,当时市场部老大,带我去上海参加电子展会,印象最深的,一些物联网云平台,靠着一份精美PPT&a…

Visual studio 下载安装

1,Visual stutdio 网址 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 2,下划页面,点击 较早的下载 3,选择对应的版本进行下载

IDEA关联Tomcat——最新版本IDEA 2024

1.链接Tomcat到IDEA上 添加Tomcat到IDEA上有两种方式: 第一种: (1)首先,来到欢迎界面,找到左侧的Customize选项 (2)然后找到Build、Execution、Deployment选项 (3&am…

LabVIEW中句柄与引用

在LabVIEW中,句柄(Handle) 是一种用于引用特定资源或对象的标识符。它类似于指针,允许程序在内存中管理和操作复杂的资源,而不需要直接访问资源本身。句柄用于管理动态分配的资源,如队列、文件、网络连接、…

使用query-string库出现错误Module parse failed: Unexpected token

环境 node v12query-string 9.1.0 报错信息 Failed to compile../node_modules/query-string/base.js 350:14 Module parse failed: Unexpected token (350:14) File was processed with these loaders:* ./node_modules/babel-loader/lib/index.js You may need an additio…

Hadoop:yarn的Rust API接口

今天头一次接触了yarn的Rust API接口,在本地搭建了集群,能够得到每个任务的详细信息。 (一)得到所有任务的所有信息命令: 默认是json格式,也可以指定xml的格式,如(curl --compressed -H "Accept: application/x…

个性化头像新选择:A1快速定制你的专属头像

个性化头像是彰显个人特色的绝佳方式,许多人为了表达自我,都会选择定制专属头像。然而,传统的定制头像服务往往价格不菲,且效果难以预测。幸运的是,AI绘画技术的发展为这一问题提供了解决方案。尽管许多AI绘画平台需要…