我用递归方法编写了一个函数来从嵌套数组中获取值。 问题是,我无法在每次调用后重置全局变量。在每次调用之后,结果将被附加到先前结果而不是给出新结果。我知道,全局变量没有被重置,因此数据将始终附加。但我无法将函数内部的变量定义为递归调用。
我该如何避免这种情况?任何帮助将不胜感激。
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]]]]);
答案 0 :(得分:1)
但我无法将函数内部的变量定义为递归 调用
您可以在函数内定义结果变量,但需要正确处理递归调用的返回值:
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;
}
(并且您不需要将结果数组作为函数的参数。)
答案 1 :(得分:0)
使用关闭来解决另一个解决方案,它可能对某人有帮助。
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;
}
}
答案 2 :(得分:0)
Hey a variant of the solution above is:
function steamrollArray(arr) {
var newArr = [];
arr.forEach(function(el){
if(!Array.isArray(el)){
newArr.push(el);
} else {
newArr = newArr.concat(steamrollArray(el));
}
});
return newArr;
}
:)
答案 3 :(得分:-1)
使用pop(array_name)删除数组中的最后一项。
- 阿达