一维数组有 12 个元素,三个换行,输出如下
现在想竖着输出,就变成 4 个换行,输出如下
可以看成一个二维数组,本质上是坐标互换了,以第一行元素举例
[[0,0][0,1],[0,2]]
变成 [[0,0],[1,0],[2,0]]
,
实现如下,也就是 rows x columns 的二维数组变成 columns x rows 的二维数组,因为输入输出都是一维,先把原数组索引转换成 x 和 y,在通过 x 和 y 计算目标数组的索引即可
let rows = 3;
columns = 4;
let nums = [];
for (let i = 0; i < rows * columns; i++) {
nums.push(i);
}
inputTable(nums, rows, columns);
convertArr(nums, rows, columns);
function convertArr(sourceArr, rows, columns) {
let targetArr = [];
sourceArr.forEach((item, index) => {
let x = (index / rows) | 0;
y = index % rows;
targetArr[y * columns + x] = item;
});
inputTable(targetArr, columns, rows);
}
function inputTable(arr, rows, columns) {
let tableArr = [];
Array(columns)
.fill(1)
.forEach(() => tableArr.push([]));
arr.forEach((item, index) => {
const pos = (index / rows) | 0;
tableArr[pos].push(item);
});
console.table(tableArr);
}
convertArr
采用创建一个新数组,其实也可以在原数组上置换,不用遍历所有元素,倒数第二行的最后一个元素置换完就可以停止了。
实现[x,y]转换为[y,x]
sourceArr.forEach((item, index) => {
let x = (index / rows) | 0;
y = index % rows;
targetArr[y * columns + x] = item;
});
inputTable
用来将一维数组输出为指定行和列的表格