flat
const arrFlat = [[1,2,3],[4,5,[6,[7,[8,[9,[10]]]]]], 'a', 'b', , null,undefined, { name: 'yy', age: 18 }]
// 不传参数,拉平一层
let newArrFlat1 = arrFlat.flat()
newArrFlat1 = arrFlat.flat(1)
// 传入一个整数参数,整数即“拉平”的层数
newArrFlat1 = arrFlat.flat(2)
// Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组
newArrFlat1 = arrFlat.flat(Infinity)
// 如果原数组有空位,flat()方法会跳过空位
实现flat
forEach(), filter(), reduce(), every() 和some() 都会跳过空位。
map() 会跳过空位,但会保留这个值。
join() 和 toString() 会将空位视为 undefined,而undefined 和 null 会被处理成空字符串。
reduce
function myFlat(value, d = 1) {
return d > 0 ? value.reduce((resArr,item)=>{
resArr.concat(Array.isArrsy(item)? myFlat(item, d - 1): item)
},[]) : value
}
reduce + prototype
Array.prototype.myFlat = function(d = 1) {
let arr = [].concat(this)
return d > 0 ? arr.reduce((resArr, item)=> {
resArr.concat(Array.isArray(item) ? myFlat(item, d - 1) : item)
}, []): arr
}
栈
function stackFlat(value) {
let stack = [...value]
let result = []
while(stack.length > 0) {
const val = stack.pop() //从从数组中删除最后一个元素,并返回该元素的值
if(Array.isArray(val)) {
stack.push(...val) // 如果是数组再次入栈,并且展开了一层
} else {
result.unshift(val) // 将val放到数组开头,会修改原数组
}
}
retuen result
}