我在此链接上找到了解决方案。
Get array's depth in JavaScript由于声誉不足,我无法发表评论,要求通过评论进行解释。
function getArrayDepth(value) {
return Array.isArray(value) ?
1 + Math.max(...value.map(getArrayDepth)) :
0;
}
let testRy = [1,2,[3,4,[5,6],7,[8,[9,91]],10],11,12]
console.log(getArrayDepth(testRy))
您能否解释为什么要加1,为什么要在上面的函数中使用Math.max函数和散布运算符?此功能如何工作?
testRy
中的各个值是:
getArrayDepth
首次执行testRy
时,Array.isArray(value)
将返回true。因此,因为这是真的,所以我们知道至少有1的深度,这就是1+
在那里的原因。然后将其加到getArrayDepth
中每个元素上调用testRy
的最大值。这样看起来像:
getArrayDepth(1) => Array.isArray() false => 0
getArrayDepth(2) => Array.isArray() false => 0
getArrayDepth([3,4,[5,6],7,[8,[9,91]],10]) => Array.isArray() true => 1 + next max
所以我们打了另一个数组,现在我们至少有另一个深度,但是我们需要检查该数组中是否有数组,所以循环将继续使用这个新数组(它仍然必须完成testRy
,但是要用它执行后,将首先通过该步骤):
getArrayDepth(3) => Array.isArray() false => 0
getArrayDepth(4) => Array.isArray() false => 0
getArrayDepth([5,6]) => Array.isArray() true => 1 + next max
并且重复直到testRy
的结尾。
首先是递归入门:
递归最终尝试解决您可能遇到的最基本形式的问题,然后将所有复杂问题逐渐缩小为最基本形式。因此,您需要以下内容(除非您全部阅读,否则可能并不完整):
基本情况
做
得到一个数组会怎样?好吧,任何数组都将具有some深度。因此,您可以计算一个,然后获取数组的内容。这就是简化步骤-您已将其从“我有一个未知深度的数组”简化为“我有我的数组的内容”。当您递归调用带有内容的getArrayDepth
时,将重新评估是否有数组并进行适当计数。如果将所有时间总和,则得到一个深度至少为1的数组,则得到深度。到目前为止,我们可以解决以下问题输入:42
输出(深度):0
为什么?:这是基本情况-它不是数组,因此我们返回0
并且不递归调用该函数。
输入:[42]
输出(深度):1
为什么?:我们有一个数组->计数深度为1时,将递归调用的结果与内容42
->相加这是基本情况-它不是数组,因此我们返回0
并且不递归调用该函数。回过头来,我们有0
和1
总计1
。
输入:[[42]]
输出(深度):2
为什么?:我们有一个数组->计算1
的深度并递归调用内容[42]
->我们有一个数组->计数深度为1并递归调用内容42
--->这是基本情况-它不是数组,因此我们返回0
并且不递归调用该函数。回过头来,我们有0
,1
和1
总计2
。
依此类推。
现在,关于为什么使用Math.max
和Math.max
。由于数组可以包含许多元素,因此您可以使用Array#map
在每个元素上调用Array#map
。这将导致进一步的递归计算,但是最后,您将获得一个元素所有深度的数组,因此.map
将转换为getArrayDepth
。由于需要获取
total
深度,因此需要最大的数字-这是通过将["a", ["b"], [["c"]]]
与[1, 2, 3]
一起使用来返回最大值。