如何将数组更改为(m x n)数组

时间:2018-10-11 18:07:40

标签: javascript

如何将实例[1, 2,...,16]的数组(向量)更改为[[1,2,3,4],..., [13, 14, 15, 16]]。我写了

function IntoMatrix(m,n, array){
temp = [];
Temp = [];
for (j=0; j<array.length; j+=m){
  for (i=0; i<n; i++){
   temp.push(array[i+j]);
    }
    Temp.push(temp);
  }
  return Temp;
}

但是可以肯定有什么问题。您是否认为我应该在concat中使用push而不是Temp方法?

4 个答案:

答案 0 :(得分:2)

对于每个内部for循环,您都需要重置temp=[]

function IntoMatrix(m,n, array){
temp = [];
Temp = [];
for (j=0; j<array.length; j+=m){
temp = [];
    for (i=0; i<n; i++){
     temp.push(array[i+j]);
        }
        Temp.push(temp);
    }
    return Temp;
}

console.log(IntoMatrix(4,4,[1,2,3,4,5,6,7,8]));

答案 1 :(得分:2)

目前尚不清楚如果m不等于原始数组的长度,那么同时占用nm * n的函数应该做什么。例如,从16个元素组成的数组中请求5x10矩阵是没有道理的。

由于n依赖于marr.length,因此我建议仅采用内部长度(m)并输出适合的行。您可以通过一个循环和slice来做到这一点:

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

function matrix(arr, m){
    let res = []
    for (let i = 0; i<arr.length; i+=m){
        res.push(arr.slice(i, i+m))
    }
    return res
}
console.log(matrix(arr, 4))  // 4 * 4
console.log(matrix(arr, 2))  // 2 * 8

答案 2 :(得分:0)

您可以使用reduce将单元格压入行数组,并将行压入结果数组。行大小由默认参数的输入长度的平方根确定,可以调整。

尚不清楚是否需要两个数字参数;一个参数来指定行大小就足够了。

const toMatrix = (a, n=a.length**0.5) => 
  a.reduce((m, e, i) => {
    if (i % n === 0) {
      m.push([]);
    }

    m[m.length-1].push(e);
    return m;
  }, [])
;

console.log(toMatrix([...Array(16).keys()].map(e => ++e)));

答案 3 :(得分:0)

您可以使用Array.from方法来获取当前值为cols * i + j的元素

function IntoMatrix(rows, cols, array) {
  return Array.from(Array(rows), (e, i) => {
    return Array.from(Array(cols), (el, j) => {
      return array[cols * i + j]
    })
  })
}

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
console.log(JSON.stringify(IntoMatrix(3, 4, arr)))
console.log(JSON.stringify(IntoMatrix(4, 5, arr)))