我正在处理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;
}
答案 0 :(得分:1)
您的output
变量应该是本地的。通过使用this.output
,它被用作全局(或通过对象共享)。你想要它在堆栈上,以便你的递归可以工作
snail = function (data) {
var output = [];
将对this.output
的所有来电更改为output