Javascript递归数组平坦化

17 浏览
0 Comments

Javascript递归数组平坦化

我正在进行练习并尝试编写一个递归的数组扁平化函数。代码如下:

function flatten() {
    var flat = [];
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i] instanceof Array) {
            flat.push(flatten(arguments[i]));
        }
        flat.push(arguments[i]);
    }
    return flat;
}

问题是,如果我传入一个数组或嵌套的数组,我会得到“超出最大调用堆栈大小”的错误。我做错了什么?

0
0 Comments

Javascript中的递归数组扁平化问题是一个常见的问题。当我们需要将多维数组转换为一维数组时,递归数组扁平化可以帮助我们快速解决这个问题。

在给定的代码中,我们定义了一个名为flatten的函数,它接受两个参数:array和result。array是待扁平化的数组,result是存储扁平化结果的数组。

函数开始时,我们首先检查数组array的长度是否为0,如果是则直接返回result。接下来,我们将数组array的第一个元素赋值给head变量,并将剩余的元素赋值给rest变量。

然后,我们检查head是否是一个数组。如果是,我们将其与rest数组连接起来,并递归调用flatten函数。这样可以将head中的所有元素添加到result数组中。

如果head不是一个数组,我们将其直接添加到result数组中。

最后,我们递归调用flatten函数,传入rest数组和result数组。这样,我们可以处理剩余的元素。

通过不断递归调用flatten函数,我们可以将多维数组转换为一维数组。这种方法避免了使用迭代循环,使代码更加简洁和易读。

我们可以通过调用flatten函数,并传入不同的数组作为参数来测试该函数。例如,我们可以使用console.log语句输出flatten([], [])的结果,这将返回一个空数组。同样地,我们可以测试flatten([1], [])、flatten([1,2,3], [])等不同的情况。

递归数组扁平化问题是一个常见的问题,通过使用递归函数,我们可以将多维数组转换为一维数组,避免使用迭代循环,使代码更加简洁和易读。

0
0 Comments

在2019年,使用ES6的flat()是一种清晰的方法来展开一个数组。这个问题的出现是因为在处理嵌套数组时,常常需要将其展开成一个扁平的数组。而解决方法就是使用flat()方法。

array.flat(Infinity)可以展开数组的所有层级。比如,对于数组[1, 1, [2, 2], [[3, [4], 3], 2]],使用array.flat(Infinity)将返回[1, 1, 2, 2, 3, 4, 3, 2]

array.flat()默认只展开一层。对于上述数组,使用array.flat()将返回[1, 1, 2, 2, Array(3), 2],其中Array(3)表示一个长度为3的数组。

array.flat(2)将展开两层。对于上述数组,使用array.flat(2)将返回[1, 1, 2, 2, 3, Array(1), 3, 2],其中Array(1)表示一个长度为1的数组。

可以通过多次调用array.flat()来展开更多层级的嵌套数组。对于上述数组,array.flat().flat()将返回[1, 1, 2, 2, 3, Array(1), 3, 2]array.flat().flat().flat()将返回[1, 1, 2, 2, 3, 4, 3, 2]

有关flat()方法的更多详细信息,可以参考Mozilla的文档:Mozilla Docs。至于浏览器的支持情况,根据Can I Use的数据,截至2022年7月,大约有95%的浏览器支持flat()方法。

0
0 Comments

问题出现的原因是在处理数组时,如果值是一个数组,你会继续调用它,导致无限循环。

解决方法之一是使用递归。在递归函数中,我们首先声明一个空数组flat。然后,我们遍历传入的参数。如果参数是一个数组,我们使用递归调用flatten函数,并将返回的结果通过push.apply方法添加到flat数组中。如果参数不是数组,我们直接将其添加到flat数组中。最后,我们返回flat数组。

这是一个更现代的版本,使用了箭头函数和扩展运算符。在这个版本中,我们使用forEach方法遍历items数组。如果item是一个数组,我们使用扩展运算符将flatten(item)的结果添加到flat数组中。如果item不是数组,我们直接将其添加到flat数组中。最后,我们返回flat数组。

另一个现代版本中,我们使用了默认参数和forEach方法。在这个版本中,我们将数组和一个累加器accu作为参数传入flatten函数。我们使用forEach方法遍历数组。如果元素是一个数组,我们递归调用flatten函数,并传入该数组和累加器accu。如果元素不是数组,我们直接将其添加到累加器accu中。最后,我们返回累加器accu。

在递归调用flatten函数时,为什么内部的flat声明不会覆盖外部的flat变量?

这是因为内部的flat变量实际上就是外部的flat变量。每个递归调用中的底层flat最终被返回,然后被推入顶层的flat中,最后被返回。

为什么你在使用forEach()而不是for...of循环?

使用forEach方法可以更简洁地遍历数组,并且语法更加清晰。for...of循环需要在每次迭代时手动获取数组中的元素,而forEach方法会自动传递元素作为参数。这样,代码更加简洁和易读。

0