为什么数字会出现在我的多维数组的末尾?

时间:2019-07-15 20:24:26

标签: javascript arrays recursion multidimensional-array

我是编程的初学者,正在寻找有关多维数组的帮助(预先感谢您的帮助!)我正在尝试在Kata上完成Code Wars,特别是“ xD -假人的阵列。”提示希望用户根据一组未知的参数返回多维数组。

例如,function dim( 3,3,"x" )应该返回[['x','x','x'],['x','x','x'],['x','x','x']]。首先,创建一个具有3个“ x”的数组(即[x, x, x]),然后再创建3个数组来存储第一个数组(即[[x, x, x], [x, x, x], [x, x, x]])。要传递kata,您将传递未知数量的参数。

我尝试创建一个迭代函数,并决定使用递归,因为我们不知道可能收到的参数数量。

到目前为止,这是我的代码...


function dim() {
  // Create an array from the arguments given when the function is called
  var args = Array.from(arguments);
  // Store the first element as value
  var val = args.pop();
  // Store the second element which we will repeat for our first array
  var d1 = args.pop();
  var xDarr = [];   

  for (var x = 0; x < d1; x++) {
    if (typeof val == 'function') {
      xDarr.push(val());
    } else {
      xDarr.push(val);
    };
  };

  if (args.length >= 1) {
    var reversedArg = args.reverse();
    return getMatrix(reversedArg, xDarr);
  } else {

    // if we are only passed 2 arguments, such as (dim (2, true)), return xDarr
    return xDarr;
  };
};

function getMatrix(arr, item) {
  // dimArr equals the first array we have created, example: "[x, x, x]"
  var dimArr = item;

  for (var i = 0; i < arr.length; i++) {
    // iterate through every other element in our args
    var finalMatrix = [];
    genMatrix(arr[i]);
    dimArr = finalMatrix; 

    // here, the recursion function to return finalMatrix
    function genMatrix(num) {
      if (num === 1) {
        return dimArr;
      } else {
        return finalMatrix.push(dimArr, genMatrix(num - 1))
      };
    };

    console.log("Updated dimArr: " + dimArr)
  };

  return dimArr;
};

该函数似乎可以使用长度为四个元素的参数(例如dim( 2,2,2,0 )),但是对于奇数参数(例如dim( 3,3,"x" )),我的函数会在结尾处返回number(s)数组。 dim( 3,3,"x" )产生以下结果:[ [ 'x', 'x', 'x' ], [ 'x', 'x', 'x' ], [ 'x', 'x', 'x' ], 2 ]。我尝试使用Mozilla进行研究,但无法弄清楚最后的“ 2”是什么。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

该数字通过递归调用插入到函数getMatrix中:

return finalMatrix.push(dimArr, genMatrix(num - 1))

此处的返回值是push返回的值,而push返回finalMatrix数组的新长度。这意味着,如果 recursive 调用也可以执行此行,则实际上会将数字作为第二个参数传递给push。并且push会将您传递给它的所有参数都推入,因此将推入此处的数字。

您可以用不同的方法解决此问题,但是由于genMatrix的初始调用实际上并未使用返回的值,因此您可以避免返回任何内容,而仅分别执行递归和push

function genMatrix(num) {
  if (num) {
    finalMatrix.push(dimArr);
    genMatrix(num - 1);
  };
};

请注意,有更简单的方法可以生成矩阵。您可以一起忽略此功能,而在getMatrix中可以做到:

for (var i = 0; i < arr.length; i++) {
  dimArr = Array(arr[i]).fill(dimArr);
}

答案 1 :(得分:0)

该函数应仅传递三个参数-不小于:

function genTable(rows, cells, content) {...

:行数

单元格:每行的单元格数量(也可以视为列)

内容:要在每个单元格中放置的值

需要两个for循环才能生成2D数组(即表和矩阵)

  • 声明了一个空数组,该空数组表示表-包含所有子数组的外部数组。

      

    |?表数组?|
       [ [...],[...],[...],[...] ]

  • 外部循环会创建一个空数组,该数组代表一行-外部数组(表)中的子数组

      

    [ [ ... ] [ ... ] [ ... ] [ ... ] 。]
      

  • 内部循环将 content [ 3 rd 参数]推入数组。

      

    [[[strong]内容,内容内容],   [内容内容内容],[内容内容 content ],[ content content content ]。]

  • 一旦内部循环迭代 N c 次( N c = 个单元< / strong> [ 2 nd 参数]])外循环的下一个循环将整个数组推入表数组,然后创建下一个数组(行)。

  • 此过程重复 N r 次( N r = 行< / strong> [ 1 st 参数])

  • 外部循环完成后,将返回表数组。

function genTable(rows, columns, content) {
  const table = [];
  for (let r = 0; r < rows; r++) {
    let rowArray = [];
    for (let c = 0; c < columns; c++) {
      rowArray.push(content);
    }
    table.push(rowArray);
  }
  return table;
}

console.log(JSON.stringify(genTable(4, 6, 'X')));

console.log(JSON.stringify(genTable(8, 2, 'Y')));

console.log(JSON.stringify(genTable(2, 10, 'Z')));