在面试中遇到展平数组的方法时该如何应对呢?
题目为:将数组arr = [1,[2,[3,4,[5,[6]]]]]展平为[1,2,3,4,5,6]
递归方法
题目属于解决自身的各个部分的问题,那么便很快的想到使用递归来解决
解题思路为:调用自身处理数组的每个子元素,直到所有子元素都被添加到结果数组中,而不再有嵌套的数组。这就是递归调用的基本思想:解决问题的每个部分,直到达到基本情况
原数组中含有两种元素:一种为数字,一种为数组
- 如果是数组,递归调用
- 不是数组,则直接加入新数组
var arr = [1,[2,[3,4]]]
function flatten(arr) {
var result = []
for(var i = 0; i < arr.length; i++) {
if(Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]))
}
else {
result.push(arr[i])
}
}
return result
}
console.log(flatten(arr));
介绍需要使用到的方法:
1、使用Array.isArray()方法检查它是否也是一个数组。
2、concat()方法用于连接两个数组,不改变原数组,而是返回一个新的数组。
3、递归地调用自身flatten(arr[i])来处理子数组,并将其返回的扁平化结果与result数组合并(flatten是一个函数翻译为压平)
在此基础上优化一下
因为arr是对象,每次循环都得访问arr.length会耗时,如果数据非常大将会大大降低运行效率
因此我们将arr.length设置为一个元素len以便能够直接调用,缓存了arr.length,避免每次都去取
var arr = [1,[2,[3,4]]]
function flatten(arr) {
var result = []
for(var i = 0,len= arr.length; i < len; i++) {
if(Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]))
}
else {
result.push(arr[i])
}
}
return result
}
console.log(flatten(arr));
看作字符串来处理
- 使用
toString()方法将数组arr转换为一个由逗号分隔的字符串
这一步会导致
[1,[2,[3,4,[5,[6]]]]]变成字符串"1,2,3,4,5,6,",丢失了数组结构和嵌套信息。
- 使用
split(',')方法将strArr字符串根据逗号分隔为一个新数组
这一步将字符串分割成新的数组
numArr,以逗号为分隔符: 结果得到["1", "2", "3", "4", "5", "6"]
- 使用
for循环遍历numArr: 将每个字符串元素转换为数字并添加到result数组中 - 使用
parseInt将numArr[i]字符串解析成整形
var arr = [1,[2,[3,4,[5,[6]]]]];
function flatten(arr) {
var strArr = arr.toString()
var numArr = strArr.split(',');
var result = [];
for(var i = 0,len = numArr.length; i < len; i++) {
result.push(parseInt(numArr[i]));
}
return result;
}
console.log(flatten(arr));
另外一种处理
parseInt是将字符串解析成整形,而Number为强转换
Javascript可以强制类型转换(Number()为显式类型转换)
for(var i = 0,len = numArr.length; i < len; i++) {
result.push(Number(numArr[i]));
}
另另另外一种处理
+ 和 Number() 是一样的作用,是隐式类型转换
+是js的语法糖, 一是拼接字符串,二是数值计算,三是类型转换
for(var i = 0,len = numArr.length; i < len; i++) {
result.push(+numArr[i]);
}
在最后优化一下,走向巅峰
使用map方法遍历strArr中的每个元素:
map方法会对数组中的每个元素执行提供的函数,并返回一个新数组,其中包含每次函数调用的结果。
在map回调函数中,将每个字符串元素转换为数字
var arr = [1,[2,[3,4,[5,[6]]]]]
function flatten(arr) {
return arr.toString().split(',').map(function(item) {
return +item
})
}
console.log(flatten(arr));
总结
当全部掌握了这些方法及优化方案后,在面试的时候给面试官狠狠拿下吧