如何重新排列我的数组值以保持与列的关系?

Posted

技术标签:

【中文标题】如何重新排列我的数组值以保持与列的关系?【英文标题】:How do I rearrange my array values so relations to columns stay? 【发布时间】:2021-09-20 09:55:30 【问题描述】:

在我提出问题之前,我必须先描述一下我的程序(如果不清楚,请说明)。

代码根据从文件中获取多少列来遍历 X nr 个排序元素,然后基于此生成 html

5 列会生成类似这样的内容(没有输入所在的表格等中的实际格式,但我认为这对这个问题并不重要):(它可能 em> 也是 55 列)

HTML:

<input type="checkbox" name="sorting[1]">
<input type="checkbox" name="sorting[2]">
<input type="checkbox" name="sorting[3]">
<input type="checkbox" name="sorting[4]">
<input type="checkbox" name="sorting[5]">

<select name="sortiteration_col[1]">
<option value="">Default</option>
<option value="0">Iteration1</option>
<option value="1">Iteration2</option>
<option value="2">Iteration3</option>
<option value="3">Iteration4</option>
<option value="4">Iteration5</option>
</select>

<select name="sortiteration_col[2]">
<option value="">Default</option>
<option value="0">Iteration1</option>
<option value="1">Iteration2</option>
<option value="2">Iteration3</option>
<option value="3">Iteration4</option>
<option value="4">Iteration5</option>
</select>

<select name="sortiteration_col[3]">
<option value="">Default</option>
<option value="0">Iteration1</option>
<option value="1">Iteration2</option>
<option value="2">Iteration3</option>
<option value="3">Iteration4</option>
<option value="4">Iteration5</option>
</select>

<select name="sortiteration_col[4]">
<option value="">Default</option>
<option value="0">Iteration1</option>
<option value="1">Iteration2</option>
<option value="2">Iteration3</option>
<option value="3">Iteration4</option>
<option value="4">Iteration5</option>
</select>

<select name="sortiteration_col[5]">
<option value="">Default</option>
<option value="0">Iteration1</option>
<option value="1">Iteration2</option>
<option value="2" selected="">Iteration3</option>
<option value="3">Iteration4</option>
<option value="4">Iteration5</option>
</select>

sortiteration_col 定义生成排序列的顺序: (迭代 0-4 相对于第 1-5 列)

1,2,3,4,5 是“正常顺序”。然后将第 1 列设置为第 0 次迭代,第 2 列设置为第 1 次迭代,第 3 列设置为第 2 次迭代,第 4 列设置为第 3 次迭代,第 5 列设置为第 4 次迭代。

也许用户想设置4,5,2,3,1,然后第 4 列设置为迭代 0,第 5 列设置为迭代 1,2 设置为迭代 2,3 设置为迭代 3,第 1 列设置为迭代 4。

用户为他/她设置迭代次数的每一列定义这个(来自 sortiteration_col[column_nr]。

在 jQuery 中我有这个代码:

$('div input[name^="sorting"]').each(function( index ) 
  var this_name = $(this).attr('name'),
  col_number  = this_name.split('[')[1].split(']')[0];

        
  //Get iteration value (which order should the sorting be done)
  //for this column
  var iteration = $('div select[name="sortiteration_col[' + col_number + ']"');

  var iteration_nr = null;
  if (iteration.length>0) 
    iteration_nr = iteration.val();
  

  console.log('COL ' + col_number + ': Iteration nr=' + iteration_nr);

);

console.log 我得到这个:

COL 1: Iteration nr=2
COL 2: Iteration nr=0
COL 3: Iteration nr=1
COL 4: Iteration nr=3
COL 5: Iteration nr=4

我希望用户能够按自定义顺序排序。而不是在下面的例子中只有 1,2,3,4,5:2,3,1,4,5

I want to do this below but not with hardcoded values ofc:

colorder_arr.push(2); //Add COL nr (iteration 0 = col 2 from above)
colorder_arr.push(3); //Add COL nr (iteration 1 = col 3 from above)
colorder_arr.push(1); //Add COL nr (iteration 2 = col 1 from above)
colorder_arr.push(4); //Add COL nr (iteration 3 = col 4 from above)
colorder_arr.push(5); //Add COL nr (iteration 4 = col 5 from above)

如何获得正确的列值以添加到 colorder_arr


EDITED/UPDATED澄清:

暂时跳过有关表单的所有内容 :-)

我有这个数组

  var iterationorder_col = [2,0,1,3,4];

假设这个数组与第 1、2、3、4、5 列相关(iterationsorder_col 中的项目数)。

这意味着

2 与第 3 列有关 0 与第 1 列有关 1 与第 2 列相关 3 与第 4 列有关 4 与第 5 列有关。

(来自项目的值 + 1 = 列 nr) 这将产生一个数组:[3,1,2,4,5]

但我希望这些重新排列如下:

值 2(因为它在 iterationorder_col 中是值 0) 值 3(因为它是 iterationorder_col 中的值 1) 值 1(因为它是 iterationorder_col 中的值 2) 值 4(因为它是 iterationorder_col 中的值 3) 值 5(因为它是 iterationorder_col 中的值 4)

(注 0、1、2、3、4)

因此新数组应该包含:

[2,3,1,4,5]

我在想一些事情是这样的:

var new_cols = [];

for(i=0;i<iterationorder_col.length;i++)           
    for (j=0;j<iterationorder_col.length;j++) 
        if ( iterationorder_col[i] == j) 
            new_cols.push(j);
            break;
              
     


但是这段代码显然不起作用:-)

【问题讨论】:

“colorder_arr”从哪里获取数据? @AlexandroPalacios - 基于 var 迭代 = $('div select[name="sortiteration_col[' + col_number + ']"');和实际的colnr:col_number。这是我想根据列和迭代相互关联的方式添加的新数组。 我想我可以帮助你,但最后一个问题,你为什么使用名称为“sorting[n]”的复选框? @AlexandroPalacios - 实际上它是一个单选按钮(我看到我输入了错误的问题),但要解释为什么它需要一个全新的问题。我不相信这对我的问题很重要。我包含的原因只是为了明确它是一个表单元素数组。 【参考方案1】:

现在你需要什么更清楚了!让我们从你的数组开始:

var iterationorder_col = [2,0,1,3,4];

现在,你需要获取数组中每个元素的索引,这意味着:

值 0 的索引为 1 值 1 的索引为 2 值 2 的索引为 0 值 3 的索引为 3 值 4 的索引为 4

为此,我建议使用indexOf() 函数,该函数返回数组中元素的索引。你可以通过for() 指令来做到这一点:

var index_array = [];

for (var i = 0; i < iterationorder_col.length; i++) 
    index_array[i] = iterationorder_col.indexOf(i);

这将给出一个数组index_array = [1, 2, 0, 3, 4] 请注意,您要在最后获得的数组等于 index_array + 1(每个项目 + 1)。 所以final_array = [2, 3, 1, 4, 5],要实现这一点,你可以对索引数组的每一项进行加法,或者你可以像这样修改最后的for()指令:

var final_array= [];

for (var i = 0; i < iterationorder_col.length; i++) 
    final_array[i] = iterationorder_col.indexOf(i) + 1;  //notice the +1 increment

就是这样 ;-) 你可以试试这个sn-p中的完整代码

var iterationorder_col = [2,0,1,3,4];

var final_array= [];

for (var i = 0; i < iterationorder_col.length; i++) 
    final_array[i] = iterationorder_col.indexOf(i) + 1;  //notice the +1 increment


console.log(final_array);

【讨论】:

唯一重要的是 var iteration = $('div select[name="sortiteration_col[' + col_number + ']"');以及它是哪一列。这应该足以回答我想要的。我遍历元素排序 $('div input[name^="sorting"]') 但我也可以遍历 $('div input[name^="sortiteration_col"]') (迭代次数相同所以没关系)。 我刚刚编辑了它。看看这是不是你想要的 我想你不明白我的意思。我将不得不澄清我的问题:-) 我编辑了我的帖子。也许我现在有了解决方案:-) 我再次对其进行了更新,并跳过了有关表单的所有内容。只是一个简单的数组,我想用那个数组做什么。我希望它清楚我想要什么。现在对我来说更清楚了:-)

以上是关于如何重新排列我的数组值以保持与列的关系?的主要内容,如果未能解决你的问题,请参考以下文章

子矩阵(暴搜(全排列)+DP)

如何在保持结构的同时使用 xslt 重新排序 xml 文件

Symfony2与列的实体关系

sed:保持模式并重新排列线

多维数组中的数组排列保持键PHP

二维数组重新排序