在遍历多维数组时记录当前下标。

前端开发 2026-07-07

这个函数在遍历多维数组的过程中应该记录当前的索引。
为了简化起见,我将在一个基本的二维数组上演示它:

[[1,2,3],[4,5,6]]

它应该输出如下内容:

value: 1 index: [0,0]
value: 2 index: [0,1]
value: 3 index: [0,2]
value: 4 index: [1,0]
value: 5 index: [1,1]
value: 6 index: [1,2]

它当前记录的是:

value: 1 index: [0,0]
value: 2 index: [0,1]
value: 3 index: [0,2]
value: 4 index: [0,1,0]
value: 5 index: [0,1,1]
value: 6 index: [0,1,2]

我找不到在何处/何时重置索引,以去掉多余的0,使之准确。

let arr = [[1,2,3],[4,5,6]]

function traverseDeep(arr, index) {
    index.push(0)
    for (let n = 0; n < arr.length; n++) {
        index[index.length-1] = n
        if (Array.isArray(arr[n])) {
            traverseDeep(arr[n], index); // Recursively jump inside the nested array
        } else {
            console.log('value: '+arr[n]+' index: ['+index+']')
        }
    }
}

traverseDeep(arr, [])

解决方案

你忘记移除在每次函数调用中创建的数组项:

对于数组 [1,2,3](n=0),我们得到索引的值为:

[0,0], [0,1], [0,2]

现在,对于第二个数组 [4,5,6](n=1),我们从索引等于 [0,2] 开始。

该命令

index[index.length-1] = n

会修改最后一个位置,其值为 2

[0, 1]

为纠正这一点,请使用函数 pop() 来移除递归中创建的索引(或使用一个辅助变量,如同其他答案中的做法):

index.pop()
let arr = [[1,2,3],[4,5,6]]

function traverseDeep(arr, index) {
    index.push(0)
    for (let n = 0; n < arr.length; n++) {
        index[index.length-1] = n
        if (Array.isArray(arr[n])) {
            traverseDeep(arr[n], index); // Recursively jump inside the nested array
        } else {
            console.log('value: '+arr[n]+' index: ['+index+']')
        }
    }
    index.pop();
}

traverseDeep(arr, [])
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章