数组拍平的两种方式

将数组拍平,第二个参数定义深度

两种方式:

  • 广度优先
  • 深度优先 两种方式在第二个参数为负值时表现不同,深度优先会在最外层多一维,主要是实现方式的差异导致的 此处的两种代码,深度优先性能更好,广度优先存在冗余操作
// 广度优先
function flatten_bfs(arr, depth = 1) {
    let res = [...arr];
    for (let i = 0; i < depth; i++) {
        const queue = res;
        res = [];
        for (const item of queue) {
            if (Array.isArray(item)) res.push(...item);
            else res.push(item);
        }
    }
    return res;
}

// 深度优先
function flatten_dfs(arr, depth = 1) {
    const res = [];
    const dfs = function(data, d) {
        if (d > 0 && Array.isArray(data)) {
            data.forEach(item => dfs(item, d - 1));
        } else res.push(data);
    };
    dfs(arr, depth + 1);
    return res;
}

const input = [1, [2, [3, 4], 5], 6, [7, 8]];
console.log(JSON.stringify(flatten_bfs(input, -1)));  // [1,[2,[3,4],5],6,[7,8]]
console.log(JSON.stringify(flatten_dfs(input, -1)));  // [[1,[2,[3,4],5],6,[7,8]]]

版权

本作品采用 CC BY-NC-ND 4.0 授权。