请说明查找数组深度的递归解决方案

问题描述 投票:-1回答:2

我在此链接上找到了解决方案。

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函数和散布运算符?此功能如何工作?

javascript arrays dictionary depth
2个回答
0
投票

testRy中的各个值是:

  • 1
  • 2
  • [3,4,[5,6],7,[8,[9,91]],10]
  • 11
  • 12

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的结尾。


0
投票

首先是递归入门:

递归最终尝试解决您可能遇到的最基本形式的问题,然后将所有复杂问题逐渐缩小为最基本形式。因此,您需要以下内容(除非您全部阅读,否则可能并不完整):

  1. 您需要解决基本情况。
    • 基本情况还用作终止条件。您想在某个时刻递归调用[[stop。一旦达到基本情况,就不再需要递归了。
  2. 您需要简化步骤。您从一个大问题开始,目标是转到它的
  3. base
  4. 形式并解决它(1的基本情况)。如果当前形式是not基,那么它是不可解决的-您需要稍微减少问题并递归调用函数。]因此,在这种情况下,

    基本情况

是您获得的值不是数组。由于它不是数组,所以没有深度,因此返回零。解决了!就是这样。但是,如果您

得到一个数组会怎样?好吧,任何数组都将具有some深度。因此,您可以计算一个,然后获取数组的内容。这就是简化步骤-您已将其从“我有一个未知深度的数组”简化为“我有我的数组的内容”。当您递归调用带有内容的getArrayDepth时,将重新评估是否有数组并进行适当计数。如果将所有时间总和,则得到一个深度至少为1的数组,则得到深度。
到目前为止,我们可以解决以下问题

输入:42输出(深度):0为什么?:这是基本情况-它不是数组,因此我们返回0并且不递归调用该函数。

输入:[42]输出(深度):1为什么?:我们有一个数组->计数深度为1时,将递归调用的结果与内容42->相加这是基本情况-它不是数组,因此我们返回0并且不递归调用该函数。回过头来,我们有01总计1

输入:[[42]]输出(深度):2为什么?:我们有一个数组->计算1的深度并递归调用内容[42]->我们有一个数组->计数深度为1并递归调用内容42 --->这是基本情况-它不是数组,因此我们返回0并且不递归调用该函数。回过头来,我们有011总计2

依此类推。

现在,关于为什么使用Math.maxMath.max。由于数组可以包含许多元素,因此您可以使用Array#map在每个元素上调用Array#map。这将导致进一步的递归计算,但是最后,您将获得一个元素所有深度的数组,因此.map将转换为getArrayDepth。由于需要获取

total

深度,因此需要最大的数字-这是通过将["a", ["b"], [["c"]]][1, 2, 3]一起使用来返回最大值。
© www.soinside.com 2019 - 2024. All rights reserved.