如何在维护局部变量历史的同时创建递归函数

How can I create a recursive function along maintaining the history of the local variables?

本文关键字:创建 递归函数 历史 维护 局部变量      更新时间:2023-09-26

下面是一个函数,它基本上接受多维数组并将其转换为一维数组。我正在使用递归来解决这个问题。此外,还有一个约束——我不能使用全局变量,因此不能在函数之外定义任何变量。

这是函数。

function flattenArray(someArr) {
    var results = [];
    if(isArrayLike(someArr)) {
        for(var i = 0; i != someArr.length; i++) {
            flattenArray(someArr[i])
        }
    } else {
        results.push(someArr);
    }
    return results;
}

在这里,函数将始终返回一个空白数组,因为每次函数递归时,它都会清除数组。那么,在不使用全局变量的情况下,如何避免这种情况呢?

假设:isArrayLike()函数返回true或false。

您可以传递累加器:

function flattenArray(someArr, acc) {
  acc = acc || [];
  if (isArrayLike(someArr)) {
    for(var i = 0; i != someArr.length; i++) {
      flattenArray(someArr[i], acc)
    }
  } else {
    acc.push(someArr);
  }
  return acc;
}

或者不使用循环,使用reduce和内置Array.isArray:

function flatten(xs) {
  return xs.reduce(function(acc, x) {
    return acc.concat(Array.isArray(x) ? flatten(x) : x)
  },[])
}

为什么不尝试将数组作为第二个参数传递给函数,最初为空数组ieflawnArray(someArr,result),而不是每次递归时都传递更新的和最新的结果数组