这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
let array = [[1,[2,3]],4,5,6,[[7]],[]]
let result = flattenArray(array)
function flattenArray(array){
...
}
看到这段代码是否有点眼熟,是的,就是扁平化,这是每个前端都应该去学习理解并且面试也常常会碰到的题
flattenArray的函数将把array处理成[1, 2, 3, 4, 5, 6, 7]并赋值给result,写出该函数实现方法
那么有几种实现方式呢?
取巧(不推荐)
let array = [[1,[2,3]],4,5,6,[[7]],[]]
let result = flattenArray(array)
function flattenArray(array){
let newArr = array.toString().split(',').map((item)=>+item)
newArr.pop()
return newArr
}
console.log(result)
// [1, 2, 3, 4, 5, 6, 7]
这种写法典型是为了答题而答题,如果在array中掺杂对象,则会出现问题
let array = [[1,[2,3]],4,5,6,[[7]],[{}]]
// ...省略,方法不变
// result
// [1, 2, 3, 4, 5, 6, 7]
最后位对象被省略了
let array = [[1,[2,3]],4,5,6,[[{}]],[]]
// ...省略,方法不变
// result
// [1, 2, 3, 4, 5, 6, NaN]
出现了NaN
这样的方法确实很不稳定,接下来看看推荐用法
reduce
let array = [[1,[2,3]],4,5,6,[[7]],[]]
let result = flattenArray(array)
function flattenArray(array) {
return array.reduce(function (prev, item) {
return prev.concat(Array.isArray(item) ? flattenArray(item) : item);
}, []);
}
console.log(result)
// [1, 2, 3, 4, 5, 6, 7]
其中会涉及的方法:
reduce接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值
reduce常见的是必须传递两个参数,reduce(total, currentValue)
- total:初始值, 或者计算结束后的返回值
- currentValue:当前元素
concat方法用于连接两个或多个数组,它包含多个参数concat(array1,array2,array3...)
这个的方法核心思想是通过递归把Array以外的类型push到数组里直至遍历结束,不懂的同学花五分钟打印一下就会明白,不要偷懒
试下更改array测试加入对象的例子
let array = [[1,[2,3]],4,5,6,[[7]],[{}]]
// ...省略,方法不变
// result
// [1, 2, 3, 4, 5, 6, 7, {}]
good
let array = [[1,[2,3]],4,5,6,[[7]],[{type:1}]]
// ...省略,方法不变
// result
// [1, 2, 3, 4, 5, 6, 7, {type:1}]
good
reset运算符
let array = [[1, [2, 3]], 4, 5, 6, [[7]], []];
let array2 = [[1, [2, 3]], 4, 5, 6, [[7]], [{type:1}]];
let result = flattenArray(array);
let result2 = flattenArray(array2);
function flattenArray(array) {
while (array.some((item) => Array.isArray(item))) {
array = [].concat(...array);
}
return array;
}
console.log(result);
// [1, 2, 3, 4, 5, 6, 7]
console.log(result2);
// [1, 2, 3, 4, 5, 6, 7, {type:1}]
好的基础才能走更远,这就好比学习算法时让实现反转数组你却用一行reverse()去提交,忘了初心不可取