数据处理 | 数组扁平化(3种)

灵魂拷问:数组扁平化的方式你知道多少呢?

方式1:Array.prototype.flat

1
2
3
4
5
6
7
8
function flatten(arr, depth) {
return arr.flat(depth);
}


// test
const arr = [1,2,3, [4,5], [[6]], [[7, [8, 9]]], 10];
console.log(flatten(arr, 2)) // [1, 2, 3, 4, 5, 6, 7, [8, 9], 10]

方式2:reduce

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function flatten(arr, depth) {
if (depth < 1) return arr;
return arr.reduce((acc, cur) => {
if (!Array.isArray(cur)) {
return acc.concat(cur);
} else {
return acc.concat(flatten(cur, depth-1));
}
}, [])
}

// 改进
function flatten(arr, depth) {
if (depth < 1) return arr;
return arr.reduce((acc, cur) => {
return Array.isArray(cur) ? acc.concat(flatten(cur, depth-1)) : acc.concat(cur);
} ,[])
}

// test
const arr = [1,2,3, [4,5], [[6]], [[7, [8, 9]]], 10];
console.log(flatten(arr, 2)) // [1, 2, 3, 4, 5, 6, 7, [8, 9], 10]

方式3: 手写递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function flatten(arr) {
let res = [];
for (let item of arr) {
if (!Array.isArray(item)) {
res.push(item)
} else {
res.push(...flatten(item))
}
};
return res;
}

// test
const arr = [1,2,3, [4,5], [[6]], [[7, [8, 9]]], 10];
console.log(flatten(arr)) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]