将一维数组重构为可变长度二维数组

时间:2018-02-22 09:37:58

标签: javascript for-loop matrix

我正在尝试将一维数组转换为二维数组,其中行的长度根据作为参数提供的最大列数而不同。我基本上想要包括每个第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的解决方案。

提前致谢!!

1 个答案:

答案 0 :(得分:0)

以下是使用array#reduce的另一种解决方案。

&#13;
&#13;
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;
&#13;
&#13;