私は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;
}