数组拍平
题目描述:实现一个数组拍平函数,例如输入:[1,[2,[3],4],5] 输出 [1,2,3,4,5]
方法一: 基本思路容易想到 💡
function flatArr(arr) {
let result = [];
// 工具函数
function toolFn(arr) {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
return toolFn(arr[i])
} else {
result.push(arr[i])
}
}
}
toolFn(arr);
return result;
}
方案二: 读完这道题就有个声音告诉你用 reduce 是不是吧?!😏
function flatArr(arr) {
return arr.reduce((pre, next) => {
pre.concat(Array.isArray(next) ? flatArr(next) : next)
}, []) // !!! 关键就是这里了, reduce的第二个参数----初始值!
}
tip
除了接受数组作为参数,concat也可以接受其他类型的值作为参数。它们会作为新的元素,添加数组尾部
[].concat(1,2,3)
等同于
[].concat(1,[2,3])
[].concat([1],[2,3])
方案三:使用toString和split (没有十年脑血栓你能想到这骚气的方法??😶)
function flattenArray(arr) {
return arr.toString().split(',').map(item => +item);
}
// 测试
let inputArray = [1, [2, [3], 4], 5];
let flattenedArray = flattenArray(inputArray);
console.log(flattenedArray); // 输出 [1, 2, 3, 4, 5]
info
方法的局限性在于,如果数组中的元素包含逗号,可能会导致错误的结果。但是思路真是清奇~
方案四:使用最新的数组flat方法
function flatArr(arr) {
// ( ﹁ ﹁ ) ~→ Infinity 一把梭,不管你是嵌套几层,直接给你干平成一维的
return arr.flat(Infinity);
}
// 或者也可以使用flat()默认的行为一次只脱掉一层
function flatArr2(arr) {
return arr.from(arr, item => Array.isArray(item) ? flatArr2(item) : item).flat()
}