我用递归方法编写了一个函数,从嵌套数组中获取值。问题是,我无法在每次调用后重置全局变量。在这里,每次调用后,结果都被附加到以前的结果,而不是给出新的结果。我知道,全局变量没有被重置,所以数据总是会被追加。但是我不能将函数中的变量定义为它的递归调用。
我该如何避免这种情况?如有任何帮助,我们将不胜感激。
var res = [];
function getData(arr) {
if(!Array.isArray(arr)) {
res.push(arr);
return res;
}
for(var i = 0; i < arr.length; i++) {
getData(arr[i]);
}
return res;
}
getData([1, [2], [3, [[4]]]]); // res = [1, 2, 3, 4]
getData([[["a"]], [["b"]]]); // res = [1, 2, 3, 4, "a", "b"], expected is res = ["a", "b"];
getData([1, {}, [3, [[4]]]]);
但我不能将函数中的变量定义为递归变量呼叫
您可以在函数中定义结果变量,但需要正确处理递归调用的返回值:
function getData(arr) {
var res = [];
if (Array.isArray(arr)) {
for (var i = 0; i < arr.length; i++) {
res = res.concat(getData(arr[i]));
}
} else {
res.push(arr);
}
return res;
}
(您不需要将结果数组作为函数的参数。)
嘿,上面的解决方案的一个变体是:
function steamrollArray(arr) {
var newArr = [];
arr.forEach(function(el){
if(!Array.isArray(el)){
newArr.push(el);
} else {
newArr = newArr.concat(steamrollArray(el));
}
});
return newArr;
}
:)
找到了另一个使用闭包的解决方案,它可能会对某些人有所帮助。
function getData(arr) {
var res = [];
return innerGetData(arr);
function innerGetData(arr) {
if(!Array.isArray(arr)) {
res.push(arr);
return res;
}
for(var i = 0; i < arr.length; i++) {
innerGetData(arr[i]);
}
return res;
}
}
使用pop(array_name)从数组中删除最后一项。
--Ada