JavaScript 中无需递归扁平化多层嵌套数组的函数


问题陈述要求用户,给定一个包含多个嵌套数组的数组,用户需要将该数组扁平化,并将任何超过一维的数组转换为 JavaScript 中的一维数组,但主要条件是不使用递归。

它也是 JavaScript 中最常被问到的前端 JavaScript 问题之一,通常会给出一个深度嵌套的示例元素数组,问题陈述要求将最深层的嵌套数组扁平化为一个仅包含一维元素的集合。

什么是 JavaScript 中的扁平化数组?

扁平化数组是在 JavaScript 中使用非递归函数将子数组连接到单个元素数组的新返回的一维数组。它是降低数组维度的过程。此外,扁平化数组将原始数组的维度降低到较低的数字,以便结果仅获得一维数组。

算法

以下问题陈述通过一个特定的算法解决,该算法如下所示:

步骤 1 - 声明一个名为 flatten 的函数,该函数将数组元素作为输入。

步骤 2 - 声明并初始化结果数组,该数组将包含作为输入给定的嵌套数组结果的扁平化数组。同时也用空数组初始化结果数组。

步骤 3 - 声明一个栈数据结构,用于在没有递归的情况下解决问题陈述,并用用户给定的所有数组元素初始化栈数组。

步骤 4 - 声明一个第一个元素变量来跟踪相对于栈的 push 和 pop 操作的元素。

步骤 5 - 使用栈数据结构和 while 循环来检查栈元素的长度是否大于 0 以执行某些任务。

步骤 6 - 将栈的第一个元素存储在第一个元素变量中。

步骤 7 - 使用 if-else 语句来检查第一个元素变量是简单数字数组还是嵌套数组,使用 isArray 方法。

步骤 8 - 如果从栈中弹出的第一个元素是一个数组,我们使用 JavaScript 中的 splice 方法提取数组中的元素,并使用 concat 方法将它们与存储的第一个元素连接起来,其中 apply 函数也充当将一个函数绑定到另一个函数中的粘合剂。这是使用三个 JavaScript 方法并行地将嵌套数组替换为其项并将其数组维度降低到较低数字的最重要步骤。

步骤 9 - 如果特定的第一个元素不是数组,则该数字将简单地推入结果数组中,并使用 splice 方法从原始数组中永久删除,以便使用相同的 while 循环和 if-else 条件再次向前移动并检查其他元素。

步骤 10 - 一旦循环到达其终止条件,将返回新的结果数组或您可以称之为结果扁平化数组,而无需使用递归。

示例

function flatten(arr) {

  var resultArray = [];

  var stackOfElements = arr;

  var firstElement;

  while (stackOfElements.length > 0) {

    firstElement = stackOfElements[0];

    if (Array.isArray(firstElement)) {

          Array.prototype.splice.apply(stackOfElements, [0, 1].concat(firstElement));
    } 
   
    else {
      resultArray.push(firstElement);

      stackOfElements.splice(0, 1);

    }

  }

  return resultArray;
}

const arr = [1, 4, 5, [
   5, 6, [
      6, 19, 5, [5]
   ], [5, 7, 6, [6, 8]], 8
], 6];


const out = flatten(arr);

console.log("output", out);

输出

output [
   1, 4, 5, 5, 6, 6,
  19, 5, 5, 5, 7, 6,
   6, 8, 8, 6
]

时间和空间复杂度

以下问题陈述使用 JavaScript 方法(如 splice 和 concat 方法)解决,这些方法遍历数组元素,最坏情况下的时间复杂度为 O(n)。由于使用了栈数据结构将数组的所有元素推入其中,因此问题陈述的空间复杂度为 O(n)。

结论

这就是我们如何在逻辑上以及在编码上下文中解决上述问题陈述的方式,利用 JavaScript 方法(如 split 和 splice 方法)以及栈数据结构在其最有效的用例中。

更新于: 2023-08-21

522 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告