0

我正在做一个 CodeWarrior.com 问题(这个问题:http: //www.codewars.com/dojo/katas/521c2db8ddc89b9b7a0000c1/play/javascript)。

我首先在 python 中实现了它,我的代码工作正常,但是在 Javascript 中,我无法让这些行output.push(snail(data)); return flattenArray(this.output);工作。以递归方式调用该方法似乎允许子方法编辑父方法内的变量。

我怎样才能防止这种情况(如果发生这种情况)?

这是我的代码:

snail = function(data) {
  console.log("snail - " + data);
  this.output = [];
  // Get the top row
  this.output.push(data.splice(0,1));

  if(data.length == 0) {
    return this.output;
  }

  // Get the right row
  for(var layer=0;layer<data.length;layer++) {
    this.output.push(data[layer].splice(data[layer].length - 1,1));
  }

  // Get the bottom row
  this.output.push(data.splice(data.length - 1,1));

  // Get the left row
  for(var layer=0;layer<data.length;layer++) {
    this.output.push(data[layer].splice(0,1));
  }

  if(data.length!=0) {
    output.push(snail(data));
    return flattenArray(this.output);
  } else {
    return this.output;
  }
}

function flattenArray(arr) {
  var r = [];
  while (!arrayEqual(r, arr)) {
    r = arr;
    arr = [].concat.apply([], arr);
  }
  return arr;
}

function arrayEqual(a, b) {
  var i = Math.max(a.length, b.length, 1);
  while(i-- >= 0 && a[i] === b[i]);
    return (i === -2);
  }

function clone(obj) {
  if (null == obj || "object" != typeof obj) return obj;
  var copy = obj.constructor();
  for (var attr in obj) {
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
  }
  return copy;
}
4

1 回答 1

1

您的output变量应该是本地的。通过使用this.output,它被用作全局(或通过对象共享)。您希望它在堆栈上,以便您的递归可以工作

snail = function (data) {
    var output = [];

将所有调用更改this.outputoutput

于 2013-10-28T23:59:15.133 回答