我正在尝试将一维数组转换为二维数组,其中行的长度根据作为参数提供的最大列数而不同。我基本上想要包括每个第n个索引,直到达到数组的末尾或者无论先前发生什么,都要完成最大列数。所以对于以下输入:
arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, 19,20]
columns = 7
我想要以下输出:
[1,4,7,10,13,16,19]
[2,5,8,11,14,17,20]
[3,6,9,12,15,18]
我尝试了以下代码,但它仅适用于少量值:
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
function getOutput(arr, columns) {
var rows = Math.ceil(arr.length / columns);
var res = [];
for (var i = 0; i < rows; i++) {
tmp = [];
for (var j = 0, index = i; j < columns; j++) {
if (index < arr.length)
tmp.push(arr[index]);
index += rows;
}
res.push(tmp);
}
return res;
}
console.log(getOutput(array, 7))
JSFiddle可在此处获取:https://jsfiddle.net/varunsharma38/fwfz4veo/4/
我不明白我错过了什么。虽然,我不介意使用一些库,但我更喜欢基于JS的基于JS的解决方案。
提前致谢!!
答案 0 :(得分:0)
以下是使用array#reduce
的另一种解决方案。
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
columns = 7,
result = arr.reduce((r,v,i,a) => {
var index = i% (Math.ceil(a.length/columns));
r[index] = r[index] || [];
r[index].push(v);
return r;
},[]);
console.log(result);
&#13;