调用函数后如何重置全局变量



我用递归方法编写了一个函数,从嵌套数组中获取值。问题是,我无法在每次调用后重置全局变量。在这里,每次调用后,结果都被附加到以前的结果,而不是给出新的结果。我知道,全局变量没有被重置,所以数据总是会被追加。但是我不能将函数中的变量定义为它的递归调用。

我该如何避免这种情况?如有任何帮助,我们将不胜感激。

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

相关内容

  • 没有找到相关文章

最新更新