JavaScript 中无需递归即可展平多个嵌套数组的函数

javascriptweb developmentfront end technology

问题陈述要求用户给定一个包含多个嵌套数组的数组,要求用户展平该数组,并在 javascript 中将任何一维以上的数组转换为一维数组,但不使用递归作为主要应用条件。

这也是 javascript 中被问得最多的前端 javascript 问题之一,它给出了一个深层嵌套的元素示例数组,所有问题陈述都要求将最深的嵌套数组展平为一个维度上的元素集合。

JavaScript 中的展平数组是什么?

展平数组是新返回的一维数组,它使用非递归函数将子数组连接到 javascript 中的一个元素数组中。这是减少数组维数的过程。此外,扁平化数组将原始数组的维度降低为一个较低的数字,这样结果应该只获得一维数组。

算法

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

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

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

步骤 3- 声明一个堆栈数据结构,用于解决问题语句而不进行递归,并使用用户输入的所有数组元素初始化堆栈数组。

步骤 4- 声明第一个元素变量来跟踪元素,以便对堆栈进行推送和弹出操作。

步骤 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 方法)和堆栈数据结构。


相关文章