代码实现
let nestedArr = [[1, 2, [3, 4]], [5, [6, 7]], 8];
function flattenArray(arr) {
const result = [];
const stack = arr.slice();
while (stack.length) {
const element = stack.pop();
if (Array.isArray(element)) {
stack.push(...element);
} else {
result.unshift(element);
}
}
return result;
}
const flatArr = flattenArray(nestedArr);
console.log(flatArr);
优化策略及其原理
- 使用栈(Stack)进行处理:
- 原理:通过将数组元素压入栈中,利用栈后进先出(LIFO)的特性,我们可以按顺序处理嵌套数组的元素。当遇到一个子数组时,将其元素展开并压入栈中,这样就可以保证所有元素以正确的顺序被处理。相比于递归方法,递归在处理大型嵌套数组时可能会导致栈溢出,而使用手动模拟栈的方式可以避免这个问题,并且在处理大型数组时性能更优。
- 使用
unshift
而不是push
:
- 原理:如果使用
push
方法,每次添加元素都需要从数组的头部开始重新计算索引位置(因为数组的长度会改变),这在处理大量元素时会带来额外的性能开销。而unshift
方法直接在数组头部添加元素,虽然也会有性能开销,但在这种从栈中依次取出元素的场景下,使用unshift
可以保证元素以正确的顺序插入到结果数组中,并且在性能上相对更优。