无法执行递归多维数组
2021-06-09
63
我正在用 javascript 创建一个递归多维数组。但是使用矩阵我发现这很困难。
例如,当我这样做时:
matrix([2,3,4])
我希望它返回这个给我:
[ [ [ 0, 1, 2, 3 ]
, [ 0, 1, 2, 3 ]
, [ 0, 1, 2, 3 ]
]
, [ [ 0, 1, 2, 3 ]
, [ 0, 1, 2, 3 ]
, [ 0, 1, 2, 3 ]
] ]
输入矩阵的长度必须是维数,数字必须是维数的值,具有 3D 2x3x4 矩阵(高度、宽度和高度)。
代码:
function copyArray(A)
{
var B=[]
for(var i=0;i<A.length;i++)
{
B[i]=A[i]
}
return B
}
function matrix(dims)
{
var I=dims[0]
dims.shift()
var A=[]
A.length=I
for(var i=0;i<I;i++)
{
var dims2=copyArray(dims)
A[i]=matriz(dims)
dims=dims2
}
return A
}
我的代码生成以下错误:
Uncaught RangeError: Invalid array length(…)
3个回答
您可以这样做,但首先应该提到:
- Array(length): 创建指定长度的数组。
- .shift(): 从数组中删除第一个元素。
- dims.length ?: 查看是否仍应执行递归函数。
- dims.slice(0): 克隆传递给函数的数组。
function matrix(dims) {
var arr = Array(dims.shift() || 0);
for(var idx = 0; idx < arr.length; idx++) {
arr[idx] = dims.length ? matrix(dims.slice(0)) : idx;
}
return arr;
}
console.log( matrix([2,3,4]) )
.as-console-wrapper {max-height: 100%!important;top:0}
Emy
2021-06-09
为此使用递归函数...根据维度构建级别,删除已处理级别的索引并向前移动...执行此操作,直到没有更多维度需要处理。
这是一个如何执行的示例...
const createRange = (FROM, TO) => [...Array(TO - FROM + 1).keys()].map(i => i + FROM);
const createMatrix = (dimensions) => {
const dim = dimensions[0];
const newDimensions = dimensions.slice(1, dimensions.length);
if (!newDimensions.length) return createRange(0, dim - 1);
return [...Array(dim).keys()]
.map(_ => createMatrix(newDimensions));
};
console.log(
createMatrix([2,3,4])
)
Rômulo Bourget Novas
2021-06-09
另一种方法是使用 Array.from() 及其内置映射器
const matrix = (dims) => (
Array.from({length: dims.shift()}, (_,i) => dims.length ? matrix([...dims]) : i)
)
console.log(matrix ([2,3,4]))
charlietfl
2021-06-09