想象一下我有一个数组:
A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9);
我希望它转换成二维数组(N x M 的矩阵),例如这样:
A = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9));
请注意,矩阵的行和列是可变的。
想象一下我有一个数组:
A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9);
我希望它转换成二维数组(N x M 的矩阵),例如这样:
A = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9));
请注意,矩阵的行和列是可变的。
像这样的东西?
function listToMatrix(list, elementsPerSubArray) {
var matrix = [], i, k;
for (i = 0, k = -1; i < list.length; i++) {
if (i % elementsPerSubArray === 0) {
k++;
matrix[k] = [];
}
matrix[k].push(list[i]);
}
return matrix;
}
用法:
var matrix = listToMatrix([1, 2, 3, 4, 4, 5, 6, 7, 8, 9], 3);
// result: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
您可以使用该Array.prototype.reduce
函数在一行中完成此操作。
ECMAScript 6 风格:
myArr.reduce((rows, key, index) => (index % 3 == 0 ? rows.push([key])
: rows[rows.length-1].push(key)) && rows, []);
“普通”JavaScript:
myArr.reduce(function (rows, key, index) {
return (index % 3 == 0 ? rows.push([key])
: rows[rows.length-1].push(key)) && rows;
}, []);
您可以将 3 更改为您想要的列数,或者更好的是,将其放入可重用的函数中:
ECMAScript 6 风格:
const toMatrix = (arr, width) =>
arr.reduce((rows, key, index) => (index % width == 0 ? rows.push([key])
: rows[rows.length-1].push(key)) && rows, []);
“普通”JavaScript:
function toMatrix(arr, width) {
return arr.reduce(function (rows, key, index) {
return (index % width == 0 ? rows.push([key])
: rows[rows.length-1].push(key)) && rows;
}, []);
}
此代码是通用的,无需担心大小和数组,通用
function TwoDimensional(arr, size)
{
var res = [];
for(var i=0;i < arr.length;i = i+size)
res.push(arr.slice(i,i+size));
return res;
}
怎么样:
var matrixify = function(arr, rows, cols) {
var matrix = [];
if (rows * cols === arr.length) {
for(var i = 0; i < arr.length; i+= cols) {
matrix.push(arr.slice(i, cols + i));
}
}
return matrix;
};
var a = [0, 1, 2, 3, 4, 5, 6, 7];
matrixify(a, 2, 4);
当我自己偶然发现这个时,我能想出的最干净的方法如下:
const arrayToMatrix = (array, columns) => Array(Math.ceil(array.length / columns)).fill('').reduce((acc, cur, index) => {
return [...acc, [...array].splice(index * columns, columns)]
}, [])
使用情况类似于
const things = [
'item 1', 'item 2',
'item 1', 'item 2',
'item 1', 'item 2'
]
const result = arrayToMatrix(things, 2)
结果最终是
[
['item 1', 'item 2'],
['item 1', 'item 2'],
['item 1', 'item 2']
]