小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
JavaScript 数组拍平
一、功能
将多层嵌套的数组拍平为一层,也叫数组扁平化
二、实现
1. ES5 返回新数组
// ES5 返回新数组
const _flat = function (arr) {
let copy = [];
arr.forEach((val) => {
if (Array.isArray(val)) {
copy = copy.concat(_flat(val))
} else {
copy = copy.concat(val)
}
})
return copy
}
2. ES5 放在数组类的原型上
// ES5 放在数组类的原型上
Array.prototype._flat = function(){
let copy = []
this.forEach((val)=>{
if(Array.isArray(val)){
copy = copy.concat(val._flat())
}else{
copy = copy.concat(val)
}
})
return copy
}
3. 一行搞定
// 一行搞定
Array.prototype._flat=function(){
return [].concat(...this.map((val=>Array.isArray(val)?val._flat():val)))
}
4. 数组的toString方法
// 数组的toString方法
// var arr = [[1, 2, 3], [6, 7, [10, 11, [12]]]]
// 特别注意toString方法返回的字符串是用 “ ,” 分割的
// 数组元素全都是 数值类型 时适用
Array.prototype._flat = function () {
let copyStr = this.toString(); // "1,2,3,6,7,10,11,12"
let copyArr = copyStr.split(",") // ['1', '2', '3', '6', '7', '10', '11', '12']
let res = copyArr.map(x => x - 0) // [1, 2, 3, 6, 7, 10, 11, 12]
return res
}
// 一行搞定
Array.prototype._flat = function () {
return this.toString().split(",").map(x => x - 0)
}
5. 用 reduce 实现 flat 函数
// 用 `reduce` 实现 `flat` 函数
const _flat = function (arr) {
return arr.reduce((pre, cur) => { return pre.concat(Array.isArray(cur) ? _flat(cur) : cur) }, [])
}
6. 控制拍平的层数
// 控制拍平的层数
// 用一个变量level来记录拍平的层数,默认值设为 Infinity, Infinity-- > 0 恒成立
const _flat = function (arr, level = Infinity) {
return level > 0 ? arr.reduce((pre, cur) => { return pre.concat(Array.isArray(cur) ? _flat(cur, level - 1) : cur) }, []) : arr.concat()
}