如何有条件地循环以将标题行映射到数据行

Posted

技术标签:

【中文标题】如何有条件地循环以将标题行映射到数据行【英文标题】:How to loop conditionally to map header rows to data rows 【发布时间】:2020-10-05 13:36:04 【问题描述】:

如果我有两种类型的行:

header rowsdata rows。并且任何行都应该由18 columns组成。

数据行数以表头行数为准,例如:

If I have 2 header rows, I should have (2 datarows: the first one map to the first header row, the second one map to the second header row + 2 datarows: the first one map to the first header row, the second one map to the second header row + 1 data rows for total: maps to the first header row ) = 5 datarows per group

If I have 3 header rows, I should have (3 datarows: the first one map to the first header row, the second one map to the second header row, the third one maps to the third header row + 3 datarows: the first one maps to the first header row, the second one maps to the second header row, the third one mapss to the third header row + 1 for total: maps to the first header row) = 7 datarowsper group

等等

NOTE: ALWAYS I SHOULD HAVE ONE DATA ROW FOR THE TOTAL DATA ROWS.

我想遍历数据行的列并映射到相关的标题col数据:

"render": function (data, type, full, meta) 

           let tooltip = isNaN(data) ? data : Number(data);

           return type === 'display' ? '<div  id="tooltip" data-tooltip="' +parsedData.columns[meta.col].toString().split("-")[0] + " = " + tooltip + "|" + meta.row + '">' + data : data;
    

我们来看第二个例子:我有两个标题行:

parsedData.columns = array[36] where 36 = 2 * 18 = number of header rows * number of columns per row.

There are multiple data rows one array for each data row = one row array[18]

meta.row = row index

我的代码中的问题是,无论标题行有多少,它总是映射到第一个标题行。

为了解决这个问题,我想做一个条件循环。

所以如果the number of header rows = array[36] /18 = 2 标题行:

第一个数据行迭代:parsedData.columns[meta.col].toString().split("-")[0] 第二次数据行迭代:parsedData.columns[meta.col-18].toString().split("-")[0] 第三行数据迭代:parsedData.columns[meta.col].toString().split("-")[0] 第四次数据行迭代:parsedData.columns[meta.col-18].toString().split("-")[0] 第五个数据行迭代:(总计)所以第一个parsedData.columns[meta.col].toString().split("-")[0]
and repeat this pattern for each group of row data(5 data rows per group), may I have 3 groups so I have 15 data rows

这里是一个基于 cmets 的例子:

528.00  -->Tooltip should = A1:528.00
52.80   -->Tooltip should = B9:52.80
240.00- -->Tooltip should = B10:240.00-
91.52   -->Tooltip should = T5:91.52

本例中的标题行 = 一个数组 [36] 数据行是多个数组(5)每个数组=数组[18]

因为我有 2 个标题行 ---> 我有 5 个数据行

2 + 2 + 1(total).

现在我想将数据行中的每个工具提示单元格映射到其等效的标题行,如上图所示。但它总是映射到第一个标题行。

【问题讨论】:

您能添加一个示例输入数据集和预期结果吗? 你能保证你的输入数据集总是以正确的顺序出现吗?例如[HR][DR][HR][DR][HR][DR]...[TR]?如果是这样,您可以按其索引处理每一行并评估它是奇数还是偶数。总行将始终排在最后,并且它的索引等于 total-1。 @Gigabyte 标题行不与数据行重复。如果我有 2hd,那么根据分组我有 6dr 或 12dr 或 18dr 或 24dr,我想正确地进行映射 我也很抱歉,但是没有输入数据和预期结果真的很难帮助你;所以,请永远一次,向我们提供您的输入数据、您的预期结果和您不工作的代码,这样我们就可以停止这个无用的乒乓球并开始为您的问题提供答案。 @ShaiCohen :对不起,我编辑了我的问题并添加了一张照片来说明这个想法,总数应该始终=1 行而不是 2 行。 【参考方案1】:

要找到对应标题,我们需要在计算中考虑总标题行。

那么下面的 javascript 函数会返回头部位置(meta.col)

function getHeaderCol(totalHeaderRows, dataRow, dataCol)
    const groupRows = (2 * totalHeaderRows) + 1
    const newDataRow = dataRow % groupRows
     return ((newDataRow % totalHeaderRows) * 18) + dataCol
    
    
    console.log(getHeaderCol(2,4,10)) // result 10 , group 1
    console.log(getHeaderCol(2,5,10)) // result 10 , group 2
    
    

【讨论】:

如果我有多个组说两个组 = 10 个数据行,它会失败,第 6 行应该属于标题 1 但它属于标题 2 我更新了函数以与多个组一起工作,如果我得到正确的话。 dataRow 和 dataCol 从零开始。请查看并提供您的反馈。 @AnynameDonotcare【参考方案2】:

初始说明:

我不是 JavaScript 专家,但您提到即使是 C# 解决方案您也会很高兴...

至于你的要求...

...

标题行和数据行。并且任何行都应该由 18 列组成

...

我想将数据行中的每个工具提示单元格映射到其等效项 标题行,如上图所示。但它总是映射到第一个 标题行。

假设目标表中的列数是恒定的(18),找到相应的标题地址的算法只是清楚的数学:

public int[] GeHeaderAddress(int metaCol)

    int noOfColumns = 18;
    int currCol = (int)(metaCol%noOfColumns);
    int currRow = (int)(metaCol/noOfColumns);
    int[] address = new int[]currRow,currCol;
    return address;

用法:

int[] address = GeHeaderAddress(18);
//returns 1,0 //as the arrays are zero-based indexed

【讨论】:

谢谢,但还是同样的问题。你能照顾好the header is a single array= array[18*2] =array[36]the data row = multiple arrays each one = array[18] 抱歉,我没听懂你的意思...如您所见,在Usage 部分我使用了18,这意味着该函数必须通过使用来获取标题行的数量原始列索引(输入数组[36])。请澄清您的输入数据。 Ex: B10 which in the second row of header = row index ‘21’ 根据您提供的图片:row index = 21 不指B10!从左到右数 21。“单元格”是指T4 下的标题。这就是为什么我要你提供样本输入数据。我猜它是这样的:string[] stringData = new string[] "A1-A2-A3-A4-A5-A6-A7-A8-A9-A10-A11-A12-B1-B2-B3-B4-B5-B6-B7-B8-B9-B10-B11-B12-T1-T2-T3-T4-T5-T6-T7-T8-T9-T10-T11-T12", "-91.52--1160-6163-188--10.56--17.6--5.28----632--528-----8-0.36----52.8--5.28------"; 因此,当您将其“转换”为具有恒定列数的数组时,您只需要传递列号。

以上是关于如何有条件地循环以将标题行映射到数据行的主要内容,如果未能解决你的问题,请参考以下文章

迭代地和分层地循环遍历行,直到满足条件

循环遍历记录集并根据条件将记录写入特定行

循环数据帧只返回一列[重复]

使用 SQL Server DTS 包有条件地在目标表中插入/更新行

如果条件为真,如何循环 LibreOffice Calc 电子表格中的行范围、比较单元格值、设置单元格值和删除行

在 Python 中使用 if 条件加速逐行循环