编码非常新,请耐心等待。我正在尝试解决Codewars上的这个Kata:https://www.codewars.com/kata/snail/train/javascript

基本上给定一个像

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

它将返回[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

蜗牛的踪迹绕着矩阵的外部向内盘旋。

我只是在解决矩阵为n x n的情况,其中n> 1且为偶数。

我通过在函数外部声明outputarray来使其工作,但我希望在函数内部声明该数组,因此包含以下行:var outputarray = outputarray || [];
不知道我要去哪里错了。
snail = function(array) {
  if (array.length == 0) {
    return outputarray
  }
  var n = array[0].length - 1;
  var outputarray = outputarray || [];
  for (var i = 0; i <= n; i++) {
    outputarray.push(array[0].splice(0, 1));
  }
  for (var i = 1; i <= n; i++) {
    outputarray.push(array[i].splice(n, 1));
  }
  for (var i = n - 1; i >= 0; i--) {
    outputarray.push(array[n].splice(i, 1));
  }
  for (var i = n - 1; i > 0; i--) {
    outputarray.push(array[i].splice(0, 1));
  }
  array.pop();
  array.shift();
  snail(array);
}

最佳答案

一种选择是在snail内定义另一个函数,该函数以递归方式调用自身,同时还在outputarray内定义snail。这样,outputarray不会暴露给外部作用域,但是递归函数仍然可以看到它。

还要注意,splice返回一个数组,所以现在,您的outputarray由一个数组组成。而是扩展为push对其进行修复,以使outputarray成为数字数组:

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

const snail = (array) => {
  const outputarray = [];
  const iter = () => {
    if (array.length == 0) {
      return
    }
    var n = array[0].length - 1;
    for (var i = 0; i <= n; i++) {
      outputarray.push(...array[0].splice(0, 1));
    }
    for (var i = 1; i <= n; i++) {
      outputarray.push(...array[i].splice(n, 1));
    }
    for (var i = n - 1; i >= 0; i--) {
      outputarray.push(...array[n].splice(i, 1));
    }
    for (var i = n - 1; i > 0; i--) {
      outputarray.push(...array[i].splice(0, 1));
    }
    array.pop();
    array.shift();
    iter(array);
  };
  iter(array);
  return outputarray;
}

console.log(snail(input));

07-25 21:46