为了获得数组的深度,我想我可以使用如下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)
@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)
您可以使用递归函数:
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)