数组扁平化

扁平化:将多维数组变成一维数组,不存在数组的嵌套

// 1. ES6 flat

const array = [1, [2, [3, [4, 5]]], 6];

const flatten = (arr) => {
    return arr.flat(Infinity);
}

flatten(array);
// 2. toString 转换成字符串,','切割

const array = [1, [2, [3, [4, 5]]], 6];

const flatten = (arr) => {
    return arr.toString().split(',').map(item => Number(item))
}

flatten(array);
// 3. 转换成字符串用正则替换所有的[]

const array = [1, [2, [3, [4, 5]]], 6];

const flatten = (arr) => {
    let str = JSON.stringify(arr).replace(/(\[|\])/g, '');
    str = `[${str}]`;
    return JSON.parse(str);
}

flatten(array);
// 4. 循环递归

const array = [1, [2, [3, [4, 5]]], 6];

const flatten = (arr = [], depth = 1) => {
    const res = [];
    (function flat(arr, depth) {
        arr.forEach(item => {
            if (Array.isArray(item) && depth > 0) {
                flat(item, depth - 1)
            } else {
                res.push(item)
            }
        })
    })(arr, depth)
    return res;
}

flatten(array, Infinity);
// 5. 使用 reduce 函数

const array = [1, [2, [3, [4, 5]]], 6];

const flatten = (arr = [], depth = 1) => {
    if (depth <= 0) return;
    return arr.reduce((res, cur) => 
        res.concat(Array.isArray(cur) 
            ? flatten(cur, depth - 1) : depth), [])
}

flatten(array, Infinity);
// 6. 使用 generator 函数

const array = [1, [2, [3, [4, 5]]], 6];

function* flatten(arr) {
    for (let item of arr) {
        if (Array.isArray(item)) {
            yield* flatten(item);
        } else {
            yield item;
        }
    }
}

console.log([...flatten(array)])
// 7. 使用堆栈 stack 避免递归,递归循环都可通过维护一个堆结构来解决

/**
  * 思路:1) 把数组通过一个栈来维护
  *       2) 当栈不为空的时候循环执行处理
  *       3) pop() 将栈尾出栈
  *       4) 如果出栈的元素是数组,就将该元素解构后每一个元素进行入栈操作
  *       5) 出栈的元素不是数组就push到返回值res中
  *       6) 反转恢复原数组的顺序
*/

const array = [1, [2, [3, [4, 5]]], 6];

const flatten = (arr) => {
    const stack = [...arr];
    const res = [];
    while (stack.length) {
        // 使用 pop 从 stack 中取出并移除值
        const next = stack.pop();
        if (Array.isArray(next)) {
            // 使用 push 送回内层数组中的元素,不会改动原始输入
            stack.push(...next);
        } else {
            res.push(next);
        }
    }
    return res.reverse();
}

flatten(array)
// 8. some + while 循环

const array = [1, [2, [3, [4, 5]]], 6];

const flatten = (arr) => {
    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}

flatten(array);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值