如何将实例[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
方法?
答案 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
不等于原始数组的长度,那么同时占用n
和m * n
的函数应该做什么。例如,从16个元素组成的数组中请求5x10矩阵是没有道理的。
由于n
依赖于m
和arr.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)))