最近在看面试题的时候,看到一道让我记忆犹深的题目,让我咬牙切齿,食不能寐,今天就让我用多种”姿势”去征服她。
题目:实现js数组扁平化。
1. 使用Array.prototype.flat():
- Array.prototype.flat() 是 JavaScript 中的一个数组方法,ES2019中引入,它可以将多层嵌套的数组结构扁平化为单层数组。这个方法会按照指定的深度递归遍历数组,并将所有元素合并到一个新数组中。
- flat()方法接受一个可选的参数,表示要扁平化的深度,默认值为 1。
- 如果要完全扁平化一个多层嵌套的数组,可以传递Infinity作为参数,当传递Infinity作为参数时,无论数组嵌套有多深,flat()都会将它扁平化到一个单一数组中。
- 示例:
let arr = [1, [2, [3, [4, 5]]], 6];
let flatArr = arr.flat(Infinity);
2. 递归方法:
- 通过forEach去遍历数组
- 判断数组中的每一个元素
- 如果是数组,则重复第一步和第二步,并把执行完毕后返回的数据添加到结果数组里面。
- 如果不是则直接添加到结果数组里面。
- 返回结果数组。
- 示例:
function flattenArray (arr) {
let result = [];
arr.forEach(item => {
if (Array.isArray(item)) {
result = result.concat(flattenArray(item));
}else {
result.push(item);
}
})
return result;
}
3. 使用reduce()和concat:
- 使用ES6的方法reduce,
reduce()是Array原型对象的一个方法。它用于将数组的所有元素缩减为单一的输出值。此方法通过执行一个提供的 reducer 函数(该函数同时接收四个参数:累加器、当前值、当前索引和源数组),对数组中的每个元素进行迭代处理。 - 初始化值为空数组[]。
- 数组调用reduce方法,传入reducer 函数,接受两个参数,累加值和当前值。
- 使用三元运算符,判断当前值是否为数组,如果是则调用自身函数,如果不是则累加值添加当前值。
- 示例:
function flattenArray (arr) {
return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenArray(val)) : acc.concat(val), [])
}
通过这三种姿势,成功的让征服了它(😊)。