数组扁平化

数组扁平化就是将多维数组转为一维数组

方式一:ES6的flat方法

数组自带的扁平化方法,flat的参数代表的是需要展开几层,如果是Infinity的话,就是不管嵌套几层,全部都展开

1
2
3
const arr = [1, [2, [3, [4, 5]]], 6];
console.log(arr.flat(Infinity));
//输出结果:[1,2,3,4,5,6]

方法二:使用正则

(1)首先是使用JSON.stringify把arr转为字符串

(2)接着使用正则把字符串里面的[和]去掉

(3)然后再拼接数组括号转为数组对象

1
2
3
4
5
const arr = [1, [2, [3, [4, 5]]], 6];
const res = JSON.stringify(arr).replace(/\[|\]/g, '');
const res2 = JSON.parse('[' + res + ']');
console.log(res2);
//输出结果:[1,2,3,4,5,6]

方法三:使用递归

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const array = [];
const fn = (arr) => {
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            fn(arr[i]);
        } else {
            array.push(arr[i]);
        }
    }
}
fn(arr);
console.log(array);

方法四:使用reduce

reduce方法:可以用来给数组求和

concat()方法:用于连接两个或多个数组

concat()方法不会更改现有数组,而是返回一个新数组,其中包含已连接数组的值

1
2
3
4
5
6
const newArr = (arr) => {
    return arr.reduce((pre, cur) => {
        return pre.concat(Array.isArray(cur) ? newArr(cur) : cur)
    }, [])
}
console.log(newArr(arr), 'reduce方法');

方法五:使用栈的思想实现flat函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
const arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, 'string', { name: '前端收割机' }];
//栈思想
function myflat(arr) {
    const res = [];
    const stack = [].concat(arr);
    while (stack.length !== 0) {
        const val = stack.pop();
        if (Array.isArray(val)) {
            stack.push(...val);
        } else {
            res.unshift(val);
        }
    }
    return res;
}

const newrr = myflat(arr);
console.log(newarr);
// 输出结果:[1,2,3,4,1,2,3,1,2,3,1,2,3,5,'string', {name:'前端收割机' }]
Built with Hugo
主题 StackJimmy 设计