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