这种问题突然出现了,但是请耐心等待,它有一个转折点。
假设你有以下数组...
[A, B, C, D, E, F, G, H , I, J, K, L]
你映射到这样的网格
| 0 1 2 3
----------
0| A D G J
1| B E H K
2| C F I L
如果需要找到网格中任何项目的原始数组索引,可以使用此公式(行和列基于零)。
col * numRows + row
所以“I”的索引位于网格上的坐标2,2
上......
2 * 3 + 2 = 8
Simples!所以现在想象你有两个阵列......
[A, B, C, D, E, F, G, H , I, J, K, L]
[@, &, *, #, €, %, ƒ, œ, ≈, ∑, ß, Ω ]
这是在这样的网格中布局的......
0 1 2 3 4 5 6 7
-----------------
0| A @ D # G ƒ J ∑
1| B & E € H œ K ß
2| C * F % I ≈ L Ω
现在你需要约束列索引,以便0& 1 = 0,2& 3 = 1等等。为此,我想出了这个公式。
Math.floor(column / numArrays) * numRows + row;
现在让我们把它变成一个装备。想象一下,你有这两个阵列(每个16个项目)
[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8]
[100,100,200,200,300,300,400,400,500,500,600,600,700,700,800,800]
但是现在,您希望网格显示已将值对相加的行
0 1 2 3
----------------
0| 2 200 10 1000
1| 4 400 12 1200
2| 6 600 14 1400
3| 8 800 16 1600
你想找到原始数组中的第一个索引,例如值8的索引将是15,或者值400的索引将是2.
我做了一个天真的假设,你可以将行和列索引乘以我用来对值进行求和的chunk size
。然而,这是完全错误的。
那么,当网格由多个数组组成时,可以使用行和列索引在平面数组中派生索引,这些数组的值已经交错,并且总和(或者我称之为“折叠”)? / p>
更新:我取得了一些进展。如果我的第二个公式是函数
func coordsToIndex(col, row, totalDataSets, totalRows) {
return Math.floor(col / totalDataSets) * totalRows + row;
}
如果变量chunkSize
表示将多少个值一起求和,那么
coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize
接近,但结果索引总是因块大小而过大。 SO!
(coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize) - chunkSize
给我正确的值,但只有当chunkSize大于零时才会导致我...
index = (coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize)
realIndex = chunkSize > 1
? (index * chunkSize) - chunkSize
: calculatedIndex;
我觉得有一种更简洁的方法可以做到这一点,而且我错过了一些明显的东西。