面试官: 请列举一下数组扁平化的实现方式
题目
给你多级嵌套数组 : [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))
思路
- 遍历数组的每一项判断是否为数组:
Array.isArray(arr[i])
- 是数组则递归调用上述代码,将此元素再次进行扁平化操作并与上一层的数组拼接:
res = res.concat(flatten(arr[i]));
- 不是数组则将值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)
思路
- 使用toString方法将数组转为由','分割的字符串形式
- 将该字符串以','分割开形成一个数组,并将数组中的每个字符转为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))
思路
-
初始值为一个空数组
[]
,这是reduce
的第二个参数,作为累积器pre
的起始值。 -
回调函数
(pre, item) => {...}
接收两个参数:累积器pre
和当前项item
。 -
对于
item
,检查它是否为数组Array.isArray(item)
。 -
如果是数组,则递归调用
flatten(item)
,将返回的扁平化后的子数组与pre
进行拼接pre.concat(flatten(item))
。这样做能够处理任意深度的嵌套数组。 -
如果不是数组,直接将
item
添加到累积器pre
中pre.concat(item)
。 -
返回结果:
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))
思路
- 使用
while
循环不断检查数组中是否还存在数组类型的元素。这通过some
方法实现,它遍历数组,对每个元素使用提供的函数(这里检查元素是否为数组)进行测试,只要有元素满足条件(即为数组),some
就返回true
。 - 在循环体内,使用
concat
方法配合扩展运算符...
来展平数组。扩展运算符将数组的每个元素(包括子数组的顶级元素)拉平到新的数组中,而concat
方法则用于合并这些元素到一个新的数组中。这个过程重复,直到数组中不再含有子数组。
本篇文章就到此为止啦,希望通过这篇文章能对你了解数组扁平化的实现
有所帮助,本人水平有限难免会有纰漏,欢迎大家指正。如觉得这篇文章对你有帮助的话,欢迎点赞收藏加关注,感谢支持🌹🌹。
转载自:https://juejin.cn/post/7371423076662411304