js小技巧,有用不火系列(会持续更新)

194 阅读1分钟

1、扁平化数组

1、const deepFlat = (arr) => { 
    return [].concat(...arr.map(x=>Array.isArray(x)?deepFlat(x):x))
}
2、es6方法flat,不过有些浏览器不兼容。
    arr.flat(Infinity)
3、转化为字符串  
    arr.toString().split(',').map(item=>+item)
4、转化为json字符串  
    JSON.stringify(arr).replace(/(\[|\])/g,'').split(',').map(item=>+item)
5、循环验证,这种方法与第一种大同小异,不过写法更简洁  
    while(arr.some(item=>Array.isArray(item))){arr=[].concat(...arr)}
    第五种方法简单解释一下,while条件为真时,{}中的语句就会执行,
    some循环遍历,只要有一个为真,arr=[].concat(...arr)就会执行。
    关于arr=[].concat(...arr),
    我给一个demo,[].concat(...[1,[2,[3]]])会输出[1,2,[3]]。
    简单来说,就是每执行一次,数组深度就会降低1

2、将数组循环遍历为树节点

var arr = [
    {id:1,pid:0,value:'a'},
    {id:2,pid:0,value:'b'},
    {id:3,pid:1,value:'aa'},
    {id:4,pid:2,value:'bb'},
    {id:5,pid:3,value:'aaa'}
]
arr.map(x=>{x.children=arr.filter(y=>y.pid===x.id); return x})

3、遍历数组深度

function getMaxFloor(treeData) {
        let max = 0
        function each(data, floor) {
            data.forEach(e => {
                if (floor > max) {
                    max = floor
                }
                if (e.children.length > 0) {
                    each(e.children, floor + 1)
                }
            })
        }
        each(treeData, 1)
        return max
 }