likes
comments
collection
share

面试官: 请列举一下数组扁平化的实现方式

作者站长头像
站长
· 阅读数 42

题目

给你多级嵌套数组 : [1, 2, [3, 4, [5]]] 将其扁平化处理 输出: [1,2,3,4,5]

什么是扁平化

数组扁平化是指将多维数组转换为一维数组的过程。在扁平化过程中,所有嵌套的数组元素被提取到一个新的一维数组中,从而简化数据结构。

怎么实现数组扁平化

直接使用内置api实现数组扁平化

const arr = [1, [2, [3, [4], [5]]]]
const newArr = arr.flat(Infinity)
console.log(newArr)

这段代码中通过将数组arr扁平化操作无数次,最终得到扁平化后的数组。

(注意:在flat函数中每扁平化操作一次数组便降低一维)

手搓一个函数实现数组扁平化

1. 递归 + concat + push

const arr = [1, 2, [3, 4, [5]]]


function flatten(arr) {
    let res = [];

    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            res = res.concat(flatten(arr[i]));
        } else {
            res.push(arr[i]);
        }
    }
    return res;
}
console.log(flatten(arr))

思路

  1. 遍历数组的每一项判断是否为数组:Array.isArray(arr[i])
  2. 是数组则递归调用上述代码,将此元素再次进行扁平化操作并与上一层的数组拼接:res = res.concat(flatten(arr[i]));
  3. 不是数组则将值push到数组中,最后将结果返回

2. 奇技淫巧使用toString方法

在JavaScript中,toString() 方法是一个数组方法,用于将数组转换为一个由数组元素组成并用逗号分隔的字符串。这意味着数组中的每个元素都会转换为其字符串形式,然后这些字符串会被连接起来,中间用逗号 , 分隔。

const arr = [1, 2, [3, 4, [5]]]

let str = arr.toString();
const newArr = str.split(',').map((item) => {
    return Number(item)
})
console.log(newArr)

思路

  1. 使用toString方法将数组转为由','分割的字符串形式
  2. 将该字符串以','分割开形成一个数组,并将数组中的每个字符转为number类型存入newArr中

3. reduce方法

reduce方法为数组中的每个元素按序执行一个函数,每一次运行这个函数时会将先前元素的计算结构作为参数传入,最后将其结果汇总为单个返回值

const arr = [1, 2, [3, 4, [5]]]
function flatten(arr) {
    return arr.reduce((pre, item) => {
        return pre.concat(Array.isArray(item) ? flatten(item) : item)
    }, [])
}

console.log(flatten(arr))

思路

  1. 初始值为一个空数组 [],这是 reduce 的第二个参数,作为累积器 pre 的起始值。

  2. 回调函数 (pre, item) => {...} 接收两个参数:累积器 pre 和当前项 item

  3. 对于 item,检查它是否为数组 Array.isArray(item)

  4. 如果是数组,则递归调用 flatten(item),将返回的扁平化后的子数组与 pre 进行拼接 pre.concat(flatten(item))。这样做能够处理任意深度的嵌套数组。

  5. 如果不是数组,直接将 item 添加到累积器 pre 中 pre.concat(item)

  6. 返回结果:reduce 方法的返回值即为最终的扁平化数组。

4. some方法 + while

some方法判断数组中是否存在至少有 1 个元素满足回调函数的条件。满足则返回true否则返回false

let arr = [1, 2, [3, 4, [5]]]
function flatten(arr) {
    while (arr.some((item) => Array.isArray(item))) {
        arr = [].concat(...arr) // [].concat()
    }
    return arr;
}
console.log(flatten(arr))

思路

  1. 使用 while 循环不断检查数组中是否还存在数组类型的元素。这通过 some 方法实现,它遍历数组,对每个元素使用提供的函数(这里检查元素是否为数组)进行测试,只要有元素满足条件(即为数组),some 就返回 true
  2. 在循环体内,使用 concat 方法配合扩展运算符 ... 来展平数组。扩展运算符将数组的每个元素(包括子数组的顶级元素)拉平到新的数组中,而 concat 方法则用于合并这些元素到一个新的数组中。这个过程重复,直到数组中不再含有子数组。

本篇文章就到此为止啦,希望通过这篇文章能对你了解数组扁平化的实现有所帮助,本人水平有限难免会有纰漏,欢迎大家指正。如觉得这篇文章对你有帮助的话,欢迎点赞收藏加关注,感谢支持🌹🌹。

面试官: 请列举一下数组扁平化的实现方式

转载自:https://juejin.cn/post/7371423076662411304
评论
请登录