这可能不是您特别寻找的解决方案,但由于它与这个问题的标题相匹配,我认为可能对其他一些寻找解决方案的人有用。
假设:
- 容器大小为 3 x 3 个单元格
- 单元格大小相同
- 我按列号而不是行来引用单元格(首先水平定位,然后垂直定位)
- 您有一个对象,其中包含有关容器中占用空间的信息(我们称之为“占用”)。在我的示例中,每个最终条目都包含一个具有“width”属性的对象,该属性包含内容的水平大小(我称它们为“平铺”),但这也可能是直接分配给条目的平面整数。
示例内容:
occupancy[0][1] = {width: 1};
occupancy[1][0] = {width: 1};
occupancy[1][1] = {width: 2};
occupancy[2][2] = {width: 1};
所以它使占用看起来像(“x”表示占用):
| - | x | - |
| x | x | x |
| - | - | x |
执行:
const COLUMNS_COUNT = 3;
const MAX_ROWS = 3;
const tilesGroupedByRowColumn = {
'0': {'1': {width: 1}},
'1': {'0': {width: 1}},
'1': {'1': {width: 2}},
'2': {'2': {width: 1}},
}
let getTileOccupancyAreasMatrix = function () {
let tileOccupancyAreasMatrix = {};
for (let row = 0; row < MAX_ROWS; row++) {
for (let column = 0; column < COLUMNS_COUNT; column++) {
if (typeof tileOccupancyAreasMatrix[row] === 'undefined') {
tileOccupancyAreasMatrix[row] = {};
}
if (tileOccupancyAreasMatrix[row][column] === 1) {
// columns have been marked used by some previous iteration,
// that was handling tiles extending to more than 1 column width
continue;
}
if (typeof tilesGroupedByRowColumn[row] === 'undefined'
|| typeof tilesGroupedByRowColumn[row][column] === 'undefined') {
tileOccupancyAreasMatrix[row][column] = 0;
continue;
}
let tileWidth = tilesGroupedByRowColumn[row][column].width;
let tileHeight = tilesGroupedByRowColumn[row][column].height;
// code below also handles the case when tile extends to next rows and column(s)
for (let rowNumber = row; rowNumber < row + tileHeight; rowNumber++) {
if (typeof tileOccupancyAreasMatrix[rowNumber] === 'undefined') {
tileOccupancyAreasMatrix[rowNumber] = {};
}
for (let columnNumber = column; columnNumber < column + tileWidth; columnNumber++) {
tileOccupancyAreasMatrix[rowNumber][columnNumber] = 1;
}
}
}
}
return tileOccupancyAreasMatrix;
},
解决方案应该适用于任何大小的容器 - 给出了 3x3 示例以简化示例。
最终解决方案可能应该接受参数而不是依赖于预定义的常量——我的示例来自我的 Vue 实现,它读取框架数据,因此不需要参数。