开发者问题收集

无法执行递归多维数组

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个回答

您可以这样做,但首先应该提到:

  1. Array(length): 创建指定长度的数组。
  2. .shift(): 从数组中删除第一个元素。
  3. dims.length ?: 查看是否仍应执行递归函数。
  4. 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