javascript 递归计算嵌套数组的数目

kr98yfug  于 2022-12-21  发布在  Java
关注(0)|答案(3)|浏览(151)

我一直在试图弄清楚如何在javascript中递归地计算嵌套数组的数量,但我似乎无法理解你将如何做到这一点。就像我知道我们将需要在那里使用一个count变量,我们将需要能够访问元素,但我们如何计算每次看到一个新的数组?这里的问题:给定一个嵌套数组,其中每个元素可以是1)整数或2)数组,其元素本身可以是整数或更多数组,计算数组的总数。
我尝试过这种方法,但在判断是否看到了新阵列时,我不知道自己在做什么。
'

function countArrays(array) {
  //counting the first array
    let sumTotal = 1;

    for(let element in array);
        if(Array.isArray(array))
            sumTotal += countArrays(array)
};

console.log(countArrays([1, 2, 3])) // 1
console.log(countArrays([1, [1, 2, 3], 3])) // 2

'

disho6za

disho6za1#

您需要迭代元素,而不是数组/对象的键。

for (let element of array)
                     ^^       ^

省略分号,因为这样可以防止下一条语句成为循环的一部分。它只是循环**之后的下一条语句。
然后检查元素是否为数组。

if (Array.isArray(element))

以及使用该项的递归调用的结果。
最后把伯爵还给我。

return sumTotal;

如果未找到return statement,则函数始终返回undefined

function countArrays(array) {
    let sumTotal = 1;

    for (let element of array)
        if (Array.isArray(element))
            sumTotal += countArrays(element);

    return sumTotal;
}

console.log(countArrays([1, 2, 3])) // 1
console.log(countArrays([1, [1, 2, 3], 3])) // 2

也许用block statement Package 循环和条件的所有语句以获得应用范围的视觉反馈更容易。

function countArrays(array) {
    let sumTotal = 1;

    for (let element of array) {
        if (Array.isArray(element)) {
            sumTotal += countArrays(element);
        }
    }

    return sumTotal;
}

console.log(countArrays([1, 2, 3])) // 1
console.log(countArrays([1, [1, 2, 3], 3])) // 2
pftdvrlh

pftdvrlh2#

另一种方法是,如果你不知道什么时候使用of循环或者in循环,可以使用一个简单的for循环,我们可以通过获取数组的长度,然后循环,看看数组中的索引是否是一个数组来实现。

function countArray(arr) {
    let count = 1;
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
           count++;
        }
    }
    return count;
}
rkue9o1l

rkue9o1l3#

尼娜的回答很棒,它解释了你做错了什么,以及如何改正。
但是如果你想找一个更简单的递归版本,你可以尝试这样做:

const countArrays = (xs) =>
  Array .isArray (xs)
    ? 1 + xs .map (countArrays) .reduce ((a, b) => a + b, 0)
    : 0

console .log (countArrays ([1, [2], 3, [4, 5, [6, 7], 8, [9, 10, [[[11, 12]]]]]]))

但我更愿意提取helper函数sum,并将其编写为:

const sum = ([x, ...xs]) =>
  x == undefined ? 0 : x + sum (xs)

const countArrays = (xs) =>
  Array .isArray (xs)
    ? 1 + sum (xs .map (countArrays))
    : 0

console .log (countArrays ([1, [2], 3, [4, 5, [6, 7], 8, [9, 10, [[[11, 12]]]]]]))

(通常我会使用更高效的reduce来编写sum,但既然您正在学习递归,那么看到它的递归版本可能也会很有用。)

相关问题