在JavaScript中获取数组的深度

enx*_*eta 1 javascript arrays

为了获得数组的深度,我想我可以使用如下flat()方法:

function getArrayDepth(ry){
  // number of levels: how deep is the array
  let levels = 1;
  // previous length
  let prev_length = 1;
  // current length
  let curr_length = ry.length;
  //if the resulting array is longer than the previous one  add a new level
  while(curr_length > prev_length){
  ry = ry.flat();
  prev_length = curr_length
  curr_length = ry.length;
  levels ++
  }
  return levels;
}



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

console.log(testRy);

console.log(getArrayDepth(testRy))

console.log(testRy);
Run Code Online (Sandbox Code Playgroud)

如果其中一个数组的长度为1,它将接缝工作,但

让testRy = [1,2,3,4,[5,6],7,[8,[9] ],10],11,12]

该函数失败,因为展平的数组与前一个数组一样长。

有没有更好的方法来获取JavaScript中数组的深度?

Tho*_*mas 11

我认为递归方法更简单。如果您当前的项目是一个数组,请确定其子项的最大深度并加 1。

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(testRy);

console.log(getArrayDepth(testRy))

console.log(testRy);
Run Code Online (Sandbox Code Playgroud)


Dan*_*oni 8

@thomas 解决方案很简洁,但我发现了一个带有空数组的边缘情况

getArrayDepth([])会返回-Infinity,这不是我所期望的,所以我稍微修改了一下,如下

const getArrayDepth = value => Array.isArray(value) ?
    1 + Math.max(0, ...value.map(getArrayDepth)) :
    0;

getArrayDepth([]); // 1
getArrayDepth([[]]); // 2
getArrayDepth([[[]]]); // 3
Run Code Online (Sandbox Code Playgroud)


sac*_*hav 5

您可以使用递归函数:

function getArrayDepth(obj) {
    if (Array.isArray(obj)) return 1 + Math.max(...obj.map(t => getArrayDepth(t)))
    else return 0
}


console.log(getArrayDepth([1,2,[3,4,[5,6],7,[8,[9,91]],10],11,12]))
console.log(getArrayDepth([1,[1]]))
Run Code Online (Sandbox Code Playgroud)

  • 不需要`t => getArrayDepth(t)-只需使用`.map(getArrayDepth)` (2认同)
  • 我会改变它,以使后卫处于最高位置。如果if(!Array.isArray(obj))返回0;`然后省略* else *语句并简单地`返回1 + Math.max(... obj.map(getArrayDepth));` (2认同)