这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
最近在面试中深感JS基础有多么重要,特此进行记录面试中遇到的问题,并进行拓展练习。 数组扁平化:也就是将一个多维数组,变成一个一维数组。
例如:
arr = [1, [2, [3, [4, 5]]], 6]
实现成:
[1, 2, 3, 4, 5, 6]
也就是形象的比喻:拍平它🥧!
下面介绍几种方法:
一、直接使用flat函数
let arr = [1, [2, [3, [4, 5]]], 6];
arr.flat(Infinity);
二、转换成字符串
let arr = [1, [2, [3, [4, 5]]], 6];
arr.toString().split(',').map(Number)
三、使用reduce
const flatten = arr => {
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatten(cur) : cur);
}, [])
}
四、递归法
const fn = arr => {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) { // 判断原数组的某一项是否也为数组
fn(arr[i]) // 递归调用
} else {
res3.push(arr[i])
}
}
}
升级版:传入参数控制拍平层级
有时候,我们可能不是需要将数组拍平成一维数组,我们可能只需要拍平自定义一个层级。这时候我们可以通过传入一个自定义的参数n来控制。
function flat(arr, num) {
if (num < 0) return arr.slice(); // 判断深度是否大于0
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flat(cur, num - 1) : cur)
}, []);
}
自己实现一个数组的flat函数
前面开头说到可以直接使用flat函数来拍平数组,其实我们自己也可以实现这个函数。
相似的,flat()也是传入数组和层级两个参数来实现拍平数组,
Array.prototype.myFlat = function(n) {
if (typeof n == 'number') {
if (n == 0) {
return this;
} else {
let flag = true;
let newArr = [];
for (let i = 0; i < this.length; i++) {
if (this[i] instanceof Array) { // 判断是否为数组的实例
newArr.push(...this[i]);
flag = false;
} else {
newArr.push(this[i])
}
}
if (n < 0 || flag) {
return this;
} else {
--n;
newArr = newArr.myFlat(n);
return newArr;
}
}
}
}