力扣刷题:扁平化嵌套数组

121 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。

问题:

请你编写一个函数,它接收一个 多维数组 arr 和它的深度 n ,并返回该数组的 扁平化 后的结果。

多维数组 是一种包含整数或其他 多维数组 的递归数据结构。

数组 扁平化 是对数组的一种操作,定义是将原数组部分或全部子数组删除,并替换为该子数组中的实际元素。只有当嵌套的数组深度大于 n 时,才应该执行扁平化操作。第一层数组中元素的深度被认为是 0。

请在没有使用内置方法 Array.flat 的前提下解决这个问题。

示例:(放代码里面)

输入
arr = [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]
n = 0
输出
[1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]]

解释
传递深度 n=0 的多维数组将始终得到原始数组。这是因为 子数组(0) 的最小可能的深度不小于 n=0 。因此,任何子数组都不应该被平面化。

思路:

函数名为flat ,它接受两个参数:一个数组arr 和一个整数n。该函数返回一个新的数组。

该函数使用递归来实现数组扁平化。如果 n 等于 0,则函数直接返回输入数组 arr。否则,它创建一个新的空数组 res,并遍历输入数组 arr 中的每个元素。

对于每个元素,函数检查它是否为数组。如果是,则使用递归调用 flat(item, n - 1) 来扁平化该子数组,并将结果添加到新数组res 中。否则,直接将该元素添加到新数组 res 中。

最后,函数返回新数组 res 作为结果。

这个函数的目的是将一个嵌套的数组扁平化为一个一维数组。扁平化的深度由参数 n 指定。

基于上述思考,代码如下:

/**
 * @param {any[]} arr
 * @param {number} depth
 * @return {any[]}
 */
var flat = function (arr, n) {
    if (n === 0) {
        return arr
    } else {
        let res = [], k = 0
        arr.forEach(item => {
            const type = toString.call(item)
            if (type === '[object Array]') {
                for (let num of flat(item, n - 1)) {
                    res[k++] = num
                }
            } else {
                res[k++] = item
            }
        })
        return res
    }
};

执行结果如下图:

image-20230626155145858.png

学到的知识点:

call 方法是 JavaScript 中的一个内置方法,它允许您调用一个函数,并显式地指定函数内部this 的值。call 方法的第一个参数是要绑定到 this 的值,其余参数是要传递给函数的参数。