JavaScript 扁平化多层嵌套数组的无递归函数
问题描述要求用户给定一个多层嵌套数组,用户被要求将数组扁平化,并将任何超过一维的数组转换为一维数组,但不能使用递归作为主要条件。
这也是JavaScript中最常问到的前端问题之一,它通常给出了一个深度嵌套的样本数组,问题陈述要求将最深层的嵌套数组扁平化为一个一维数组中的元素集合。
JavaScript中的扁平化数组是什么
扁平化数组是使用非递归函数将子数组连接为一个单一的元素数组的新返回的一维数组。它是减少数组维度的过程。此外,扁平化数组将原始数组的维度减小到较低的数字,结果应该仅仅是一个一维数组。
步骤
以下问题陈述使用一个特定的算法解决,看起来像下面这样:
步骤1 − 声明一个名为flatten的函数,它以数组元素作为输入。
步骤2 − 声明并初始化结果数组,它将包含作为输入给定的嵌套数组的扁平化数组。同时用一个空数组初始化结果数组。
步骤3 − 声明一个栈数据结构,用于解决问题陈述而不使用递归,并将栈数组初始化为用户给定的所有数组元素。
步骤4 − 声明一个First Element变量,用于跟踪推入和弹出操作的元素,与栈相关。
步骤5 − 使用栈数据结构和while循环来检查栈元素的长度是否大于0,并执行特定任务。
步骤6 − 将栈的第一个元素存储在First Element变量中。
步骤7 − 使用if-else条件来检查First Element变量是一个简单的数组还是嵌套数组,使用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方法,以及堆栈数据结构的最有效用例。