toString
利用 toString
的遍历转化成字符串的特点来实现,然后对生成的字符串进行分割。
缺点:仅能对纯字符或者纯数字数组进行扁平化。
function flat(arr) {
return arr.toString().split(',').map(i => parseFloat(i))
}
let a = [1, [2, 3, [4]]]
console.log(flat(a))
JSON.stringify
先看一下转换的效果
function flat(arr) {
return JSON.stringify(arr)
}
let a = [1, [2, 3, [4]]]
console.log(flat(a))
显然,与 toString 不同的是,Json.stringify 得到的结果还需要去中括号操作,使用正则匹配进行替换即可。
function flat(arr) {
return JSON.stringify(arr).replace(/(\[|\])/g, '').split(',').map(i => parseFloat(i)) //注意正则中不要随意加空格
}
let a = [1, [2, 3, [4]]]
console.log(flat(a))
递归遍历
支持所有类型数组的方法还是得自己通过遍历的方式来实现。
function flat(arr) {
let res = []
let help = (arr) => {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) { //优于 instanceOf Array,好像是因为iframes
help(arr[i])
} else {
res.push(arr[i])
}
}
}
help(arr)
return res
}
let a = [1, [2, 3, [4]]]
console.log(flat(a))