有时候我们需要把多维数组拍平成一维数组,俗称“Javascript数组扁平化”。 这里提供JS数组扁平化的五种办法。
一、利用ES6的flat方法
let arr = [
[1, 2, 2],
[3, 4, 5, 5],
[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
]
arr = arr.flat(Infinity)
console.log(arr)
二、用toString方法
用toString方法转换成字符串,再合成数组,此时数组每一项是字符串,用Number方法或者parseFloat把字符串转换成字符
let arr = [
[1, 2, 2],
[3, 4, 5, 5],
[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
]
arr = arr.toString().split(',').map(item => parseFloat(item))
console.log(arr)
三、用JSON.stringify方法
用JSON.stringify方法转换成字符串,此时字符串包含中括号,用正则表达式去除中括号字符,再合成数组,此时数组每一项是字符串,用Number方法或者parseFloat把字符串转换成字符
let arr = [
[1, 2, 2],
[3, 4, 5, 5],
[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
]
arr = JSON.stringify(arr).replace(/(\[|\])/g,'').split(',').map(item => parseFloat(item))
console.log(arr)
四、基于数组的some和Array.isArray方法进行判断检测
let arr = [
[1, 2, 2],
[3, 4, 5, 5],
[6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
]
while(arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
console.log(arr)
五、递归深度遍历
如果发现不是数组,则放入新数组,如果是数组,则继续调用方法,直到里面的数字都被拿出来
Array.prototype.MyFlat = function () {
let _this = this
let result = []
let fn = (arr) => {
for (let i=0; i< arr.length; i++) {
let item = arr[i]
if (Array.isArray(item)) {
fn(item)
} else {
result.push(item)
}
}
}
fn(_this)
return result
}
console.log(arr.MyFlat())