MST

星途 面试题库

面试题:JavaScript数组读写优化之复杂场景

给定一个多层嵌套的数组`let nestedArr = [[1, 2, [3, 4]], [5, [6, 7]], 8]`,要求通过优化的代码将所有元素取出并放入一个新的一维数组,同时要确保在处理大型嵌套数组时性能高效。请写出代码实现,并阐述你所采取的优化策略及其原理。
22.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

代码实现

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); 

优化策略及其原理

  1. 使用栈(Stack)进行处理
    • 原理:通过将数组元素压入栈中,利用栈后进先出(LIFO)的特性,我们可以按顺序处理嵌套数组的元素。当遇到一个子数组时,将其元素展开并压入栈中,这样就可以保证所有元素以正确的顺序被处理。相比于递归方法,递归在处理大型嵌套数组时可能会导致栈溢出,而使用手动模拟栈的方式可以避免这个问题,并且在处理大型数组时性能更优。
  2. 使用unshift而不是push
    • 原理:如果使用push方法,每次添加元素都需要从数组的头部开始重新计算索引位置(因为数组的长度会改变),这在处理大量元素时会带来额外的性能开销。而unshift方法直接在数组头部添加元素,虽然也会有性能开销,但在这种从栈中依次取出元素的场景下,使用unshift可以保证元素以正确的顺序插入到结果数组中,并且在性能上相对更优。