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

时间:2016-04-28 18:38:22

标签: javascript recursion global-variables

我用递归方法编写了一个函数来从嵌套数组中获取值。 问题是,我无法在每次调用后重置全局变量。在每次调用之后,结果将被附加到先前结果而不是给出新结果。我知道,全局变量没有被重置,因此数据将始终附加。但我无法将函数内部的变量定义为递归调用。

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

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]]]]);

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)删除数组中的最后一项。

- 阿达