数组扁平化

数组扁平化

数组扁平化

数组扁平化是讲一个多维数组编程一个一维数组

1
2
[1, 2, 3, [4, 5, [6, 7]]] // 转换前
[1, 2, 3, 4, 5, 6, 7] // 转换后

下面介绍几种数组扁平化的方式

1. 简单递归实现

这里将flat函数挂载到原型链上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array.prototype.flat = function() {
let arr = this // 数组本身
let ret = [] // 存储扁平化后的数组
arr.forEach((item) => {
// 判断是否为数组
if (!Array.isArray(item)) {
// 如果不为数组,将该项直接push到ret
ret.push(item)
} else {
// 如果为数组,则调用其flat()方法,使用es6的扩展运算符将结果push到ret
ret.push(...item.flat())
}
})
return ret
}

let arr = [1, 2, 3, [4, 5, [6, 7]]]
console.log(arr.flat())
// [1, 2, 3, 4, 5, 6, 7]

2. ES6 flat方法

使用es6的arr.flat()方法即可,传入的参数为扁平化的层数,如果为Infinity则表示不管多少层,都扁平化为一维数组

1
2
3
4
5
let arr = [1, 2, 3, [4, 5, [6, 7]]]
console.log(arr.flat(Infinity))
// [1, 2, 3, 4, 5, 6, 7]
console.log(arr.flat(1))
// [1, 2, 3, 4, 5, [6, 7]]

3. 模拟es6方法

上面的第一种方式已经实现了数组扁平化,现在要传入一个参数level,表示扁平化的层数。

并且在开始判断层数是否存在,或者是否小于等于0

递归的时候传入参数 level - 1 即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Array.prototype.flat = function(level) {
// 判断level是否存在,或小于等于0
if (!level || level <= 0 ) {
return this
}
let arr = this // 数组本身
let ret = [] // 存储扁平化后的数组
arr.forEach((item) => {
// 判断是否为数组
if (!Array.isArray(item)) {
// 如果不为数组,将该项直接push到ret
ret.push(item)
} else {
// 如果为数组,则调用其flat()方法,使用es6的扩展运算符将结果push到ret
// 参数为 level - 1
ret.push(...item.flat(level - 1))
}
})
return ret
}

let arr = [1, 2, 3, [4, 5, [6, 7, [8, 9]]]]
console.log(arr.flat(0)) // [ 1, 2, 3, [ 4, 5, [ 6, 7, [Array] ] ] ]
console.log(arr.flat(1)) // [ 1, 2, 3, 4, 5, [ 6, 7, [ 8, 9 ] ] ]
console.log(arr.flat(2)) // [ 1, 2, 3, 4, 5, 6, 7, [ 8, 9 ] ]
console.log(arr.flat(Infinity)) // [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

以上就是数组扁平化的简单实现,核心思想就是递归

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×