开发者问题收集

递归计算嵌套数组的数量

2022-12-20
1109

我一直在尝试弄清楚如何在 javascript 中递归计算嵌套数组的数量,但我似乎无法理解如何做到这一点。就像我知道我们需要在其中使用计数变量,并且我们需要能够访问元素,但是每次看到新数组时我们如何计算?问题是:给定一个嵌套数组,其中每个元素可能是 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

`

3个回答

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

    for (let element of array)
                     ^^       ^

省略分号,因为这会阻止下一个语句成为循环的一部分。它只是循环 之后 的下一个语句。

然后检查元素是否为数组。

        if (Array.isArray(element))

以及使用此项目进行递归调用的结果。

最后返回计数。

    return sumTotal;

如果没有找到 return 语句 ,则函数始终返回 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

也许使用 块语句 包装所有循环和条件语句更容易,以获得应用范围的视觉反馈。

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
Nina Scholz
2022-12-20

Nina 的回答很棒。它解释了你做错了什么以及如何修复它。

但是如果你正在寻找一个更简单的递归版本,你可以尝试这样的方法:

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]]]]]]))

但我更愿意提取辅助函数 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 ,但由于你正在研究递归,查看它的递归版本可能也很有用。)

Scott Sauyet
2022-12-20

如果您不清楚何时使用 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;
} 
benji
2022-12-20