记录数组最大深度学习

219 阅读1分钟

怎样求数组最大深度?

类似这样的数组

let arr1 = [1,2,3]  //  1
let arr2 = [1,[2],[3]]  //  3

有什么方法呢?第一时间想到的是迭代

迭代计算

  • 思路
  1. 遍历整个数组 比如:arr1 或者 arr2
  2. 如果没有数组类型的子元素 就记录1
let arr1 = [1,2,3],remberArr = [];

// 计算一个新的数组时,num 应该等于0
function getDeep(arr,num = 0) {
    let flag = false;
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            flag = true
        }
    }
    //  +1 是因为初始数组的深度为1
    if(!flag) {
        remberArr.push(num + 1)
    }
}
getDeep(arr1)
console.log(remberArr)  //  [1]

如果有嵌套数组呢?比如上边arr2,就需要将arr[2],当作一个新的数组调用getDeep,并记录当前已有的深度,在原有的深度基础上加1

let arr3 = [1,[2]],remberArr = [];
function getDeep(arr,num = 0) {
    let flag = false;
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            flag = true
            num = num + 1  /* 当前深度 */
            getDeep(arr[i],num) 
        }
    }
    //  如果没有数组类型的子元素 就记录当前num的值
    //  通过 getDeep 函数已经完成了深度 + 1
    //  这里的 +1 就是初始数组的深度 arr2
    if(!flag) {
        remberArr.push(num + 1)
    }
}
getDeep(arr1)
console.log(remberArr)  //  [2] 

再来测试

let arr4 = [1, [2, [3]]]
getDeep(arr4)
console.log(remberArr) //  [3]

深度为3,到目前为止一切正常,再来看

let arr2 = [1,[2],[3]]
getDeep(arr2)
console.log(remberArr) //  [2, 3]

返回了[2, 3],这是不对的,哪里出了问题呢?

  • 步骤
  1. 执行元素[2]的时候,num的值为2
  2. 执行元素[3]的时候,num的值又加了1,这显然是不对的

既然多加1,就减1

function getDeep(arr,num = 0) {
    let flag = false;
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            flag = true
            num = num + 1  /* 当前深度 */
            getDeep(arr[i],num) 
            num = num - 1
        }
    }
    //  如果没有数组类型的子元素 就记录当前num的值
    //  通过 getDeep 函数已经完成了深度 + 1
    //  这里的 +1 就是初始数组的深度 arr2
    if(!flag) {
        remberArr.push(num + 1)
    }
}

再来测试,

let arr2 = [1,[2],[3]]
getDeep(arr2)
console.log(remberArr) //  [2, 2]

OK了,一切正常了,来测试一个稍微复杂的

let arr5 = [1,[2,[4,'a',[5,[10,10]],[6]]],[3],[7,[8,[9]]]]
getDeep(arr2)
console.log(remberArr) //  [5, 4, 2, 4]
// 求出remberArr最大深度,这个...

第二种思路

let arr5 = [1,[2,[4,'a',[5,[10,10]],[6]]],[3],[7,[8,[9]]]]
console.log(JSON.stringify(arr5)
// 得到了字符串 [1,[2,[4,"a",[5,[10,10]],[6]]],[3],[7,[8,[9]]]]

去掉数组元素,

[[[[[ ]] [ ]]] [ ] [[[ ]]]]

去掉 ']'

[[[[[  [  [  [[[ 
  1. str = JSON.stringify(arr)
  2. arr = str.split(']')
 arr = ['[1,[2,[4,"a",[5,[10,10', '', ',[6', '', '', ',[3', ',[7,[8,[9', '', '', '', '']
  1. 求出arr最大长度

示例代码

function arrMethordGetDeep(arr) {
    let deepNumber = 0;
    if(!Array.isArray(arr)){
        return
    } else {
        deepNumber = 1;
    }
    const str = JSON.stringify(arr);
    let stringArr = str.split(']');
    stringArr.length && stringArr.map(item=>{
        getDeepNumber(item,0,0,maxNumber)
    })
    function maxNumber(num){
        deepNumber = Math.max(deepNumber,num)
    }
    return deepNumber;
}

let tem = 0;
function getDeepNumber(str,tem = 0, start = 0,callback) {
    let index = str.indexOf('[',start)
    if(index != -1) {
        tem += 1;
        getDeepNumber(str,tem,index+1,callback)
    } else {
        callback(tem)
    }

}
let arr5 = [1,[2,[4,'a',[5,[10,10]],[6]]],[3],[7,[8,[9]]]]
console.log(arrMethordGetDeep(arr5))  // 5

总结:

  • 方法1使用了迭代,真的是难,想了很久,基础太弱了,唉。。
  • 方法2有很明显的缺陷,聪明的你一定知道('['),但绝对能实现。

边界条件没有计算在内,接下来会慢慢加上去,水平有限难免有错误,欢迎指出,如果对您有帮助,请点赞支持,谢谢