在此代码中使用全局变量的最佳替代方法

时间:2016-12-02 19:57:14

标签: javascript function recursion

自从我开始编程以来,我似乎一直瞄准全局变量,并且发现没有它们很难工作,并且发现这里使用递归函数特别困难。有人可以帮助我使用此代码使其全局变量免费吗?此外,是否有一个参考,可以帮助改变思维方式,所以我最终不觉得需要它们?我觉得代码需要改变的方式,但我不知道是什么。



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;
&#13;
&#13;

5 个答案:

答案 0 :(得分:2)

只需在函数内声明变量,并在结尾处返回它。适当处理递归调用。

&#13;
&#13;
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;
&#13;
&#13;

这与您的代码完全不同,但它可能是您所希望的。

答案 1 :(得分:1)

您可以将结果数组作为参数传递,因为数组和对象是通过JS中的引用传递的。

&#13;
&#13;
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;
&#13;
&#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)

reduceSpread operator (ES6)的帮助下,您甚至可以在没有任何变量分配的情况下解决您的问题:

&#13;
&#13;
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;
&#13;
&#13;

答案 4 :(得分:1)

好的,这是真正的递归:

&#13;
&#13;
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;
&#13;
&#13;