数组展平

131 阅读1分钟

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
}