Этот тип вопросов так часто всплывает, но терпите меня, у него есть поворот.
Допустим, у вас есть следующий массив ...
[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
, который я использовал для суммирования значений. Это, однако, совершенно неправильно.
Итак, возможно ли получить индекс в виде плоского массива, используя индексы строк и столбцов, когда сетка состоит из нескольких массивов, значения которых были чередованы и суммированы (или, как я это называю, «свернут»)?
ОБНОВЛЕНИЕ: я немного продвинулся. Если бы моей второй формулой была функция
func coordsToIndex(col, row, totalDataSets, totalRows) {
return Math.floor(col / totalDataSets) * totalRows + row;
}
И если переменная chunkSize
указывает, сколько значений суммируется вместе, то это
coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize
Подходит близко, но результирующий индекс всегда слишком велик по размеру куска. ТАК!
(coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize) - chunkSize
Дает мне правильное значение, НО только когда chunkSize больше нуля, что приводит меня к ...
index = (coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize)
realIndex = chunkSize > 1
? (index * chunkSize) - chunkSize
: calculatedIndex;
Я чувствую, что есть более аккуратный способ сделать это и что я упускаю что-то явно очевидное.