怎样求数组最大深度?
类似这样的数组
let arr1 = [1,2,3] // 1
let arr2 = [1,[2],[3]] // 3
有什么方法呢?第一时间想到的是迭代
迭代计算
- 思路
- 遍历整个数组 比如:arr1 或者 arr2
- 如果没有数组类型的子元素 就记录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],这是不对的,哪里出了问题呢?
- 步骤
- 执行元素[2]的时候,num的值为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]]]]
去掉数组元素,
[[[[[ ]] [ ]]] [ ] [[[ ]]]]
去掉 ']'
[[[[[ [ [ [[[
- str = JSON.stringify(arr)
- arr = str.split(']')
arr = ['[1,[2,[4,"a",[5,[10,10', '', ',[6', '', '', ',[3', ',[7,[8,[9', '', '', '', '']
- 求出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有很明显的缺陷,聪明的你一定知道('['),但绝对能实现。
边界条件没有计算在内,接下来会慢慢加上去,水平有限难免有错误,欢迎指出,如果对您有帮助,请点赞支持,谢谢。