自从我开始编程以来,我似乎一直瞄准全局变量,并且发现没有它们很难工作,并且发现这里使用递归函数特别困难。有人可以帮助我使用此代码使其全局变量免费吗?此外,是否有一个参考,可以帮助改变思维方式,所以我最终不觉得需要它们?我觉得代码需要改变的方式,但我不知道是什么。
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]);
}
}
}
&#13;
答案 0 :(得分:2)
只需在函数内声明变量,并在结尾处返回它。适当处理递归调用。
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]]]]));
&#13;
这与您的代码完全不同,但它可能是您所希望的。
答案 1 :(得分:1)
您可以将结果数组作为参数传递,因为数组和对象是通过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]);
}
}
}
&#13;
答案 2 :(得分:1)
你可以嵌套函数:
function steamrollArray(inputArray) {
var res = [];
var process = function(arrayToProcess){
for (var i=0; i<arrayToProcess.length ; i++){
if (Array.isArray(arrayToProcess[i])){
process(arrayToProcess[i]);
}
else {
res.push(arrayToProcess[i]);
}
}
};
process(inputArray);
return res;
}
steamrollArray([1, {}, [3, [[4]]]]);
答案 3 :(得分:1)
在reduce
和Spread operator (ES6)的帮助下,您甚至可以在没有任何变量分配的情况下解决您的问题:
function flatten(arr) {
return arr.reduce((p, c) => {
if (Array.isArray(c)) {
return [...p, ...flatten(c)];
}
return [...p, c];
}, [])
}
console.log(flatten([1, {}, [3, [[4]]]]));
&#13;
答案 4 :(得分:1)
好的,这是真正的递归:
console.log(f([1, {}, [3, [[4]]]]));
function f(xs){
if (xs.length === 0) return xs;
return (Array.isArray(xs[0]) ? f(xs[0]) : [xs[0]]).concat(f(xs.splice(1)));
}
&#13;