今天看到一个话题讨论JavaScript数组扁平化,忍不住自己也实现一下,在下采用的方式和别人不同,talk is cheap,show you the code!

法一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function flattenArray(arr) {
if (arr && Array.isArray(arr)) {
return arr.reduce((acc, cur) => {

acc = acc.concat(cur)
for(let item of acc) {
if (item && item instanceof Array) {
return arguments.callee(acc)
}
}
return acc
}, [])
}
}

法二:

1
2
3
4
5
6
function flattenArr(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
return arr
}

法三:递归

1
2
3
4
5
6
7
8
9
function flatten(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] instanceof Array) {
res = res.concat(flatten(arr[i]))
} else res.push(arr[i])
}
return res
}

法四:reduce递归

1
2
3
4
5
function flatten(arr) {
arr.reduce((prev, val) => {
return prev.concat(Array.isArray(val) ? flatten(val) : val)
}, [])
}

法五:JSON.stringify / JSON.parse(结合正则替换)

1
2
3
4
5
6
function flatten(arr) {
let str = JSON.stringify(arr)
str = str.replace(/\[|\]/g, '')
// console.log(str, 777)
return JSON.parse('[' + str + ']')
}

这可以解决任何多维数组的扁平化,比如,我们实验一下:

1
2
3
let arr = [1, [2,11], [3,[4,5]],[6,[7, [8,[9]]]]]
let c = flattenArray(arr)
console.log(c)

输出,如下:

如此,我们就解决了数组扁平化操作。如有不当之处,希望批评指教!在此谢过!