javascript - 如何创建递归函数并维护局部变量的历史记录?

标签 javascript arrays recursion

下面是一个基本上接受多维数组并将其转换为一维数组的函数。我正在使用递归来解决这个问题。另外,还有一个限制 - 我无法使用全局变量,因此不能在函数外部定义任何变量。

这是函数。

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)
  },[])
}

关于javascript - 如何创建递归函数并维护局部变量的历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26566233/

相关文章:

Conway 的生命游戏 (C) - 坐标不对应于 2D 数组索引?

algorithm - 寻找树的深度?

java - 链表上的递归 : how to compare?

algorithm - 带递归的 Strassen 子三次矩阵乘法算法

javascript - 使用 Object.assign() 删除克隆对象的嵌套属性会影响原始对象

javascript - 如何在保留其他值的同时设置单个转换值?

javascript - 在 react 组件之外使用 react 上下文

javascript - AJAX:如何读取 JSON 数据

javascript - jquery $.when.apply().done 未触发

java - 如何确保写入整数数组的可见性