自从我开始编程以来,我似乎把目标对准了全局变量,发现没有它们很难工作,在这里使用递归函数尤其困难。有没有人能帮我把这段代码变成无全局变量的?另外,有没有可以帮助我改变思维方式的参考资料,这样我就不会觉得需要它们了?我觉得我思考代码的方式需要改变一些东西,但我不知道是什么。
var res = [];
function steamrollArray(arr) {
// I'm a steamroller, baby
func(arr);
console.log(res);
return res;
}
steamrollArray([1, {}, [3, [[4]]]]);
function func(array){
for (var i=0; i<array.length ; i++){
if (Array.isArray(array[i])){
func(array[i]);
}
else {
res.push(array[i]);
}
}
}
发布于 2016-12-03 04:05:36
您可以将结果数组作为参数传递,因为在JS中数组和对象是通过引用传递的。
function steamrollArray(arr) {
// I'm a steamroller, baby
var res = [];
func(arr, res);
console.log(res);
return res;
}
steamrollArray([1, {}, [3, [[4]]]]);
function func(array, res){
for (var i=0; i<array.length ; i++){
if (Array.isArray(array[i])){
func(array[i], res);
}
else {
res.push(array[i]);
}
}
}
发布于 2016-12-03 04:06:40
只需在函数内部声明变量,并在末尾返回它。适当地处理递归调用。
function flatten(array){
var res = [];
for (var item of array) {
if (Array.isArray(item))
res.push(...flatten(item));
else
res.push(item);
}
return res;
}
console.log(flatten([1, {}, [3, [[4]]]]));
这与您的代码并不完全一样,但这可能是人们所期望的。
发布于 2016-12-03 04:04:26
另一种方法是使用单个函数,该函数迭代并收集数据,并仅返回部分收集的数据。
function steamrollArray(array) {
var result = [];
for (var i = 0; i < array.length; i++) {
if (Array.isArray(array[i])) {
result = result.concat(steamrollArray(array[i]));
} else {
result.push(array[i]);
}
}
return result;
}
console.log(steamrollArray([1, {}, [3, [[4]]]]));
https://stackoverflow.com/questions/40939958
复制相似问题