数组扁平化,之前面试经常问的一个问题。废话不多说。方法有很多,这里说四种。为了方便记录,这里代码都在最后。 方法有:
- 递归
- toString 方法,缺点 number类型数组也会转换为string类型
- reduce 方法
- 学习undercore
let arr = [1,'2',3,4, [5,6,7,[8,9,[10,11]]]]
function flatten(arr) {
let result = [];
for (let 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, '2', 3, 4, 5, 6,
7, 8, 9, 10, 11, 12,
13
]
*/
// 2. toString 方法
console.log(arr.toString()); // 1,2,3,4,5,6,7,8,9,10,11,12,13
// 3 reduce
function reduceFlatten(arr) {
return arr.reduce((pre, cur) => {
console.log(pre, cur);
return pre.concat(Array.isArray(cur) ? reduceFlatten(cur) : cur)
}, [])
}
console.log(reduceFlatten(arr));
/**
*
[
1, '2', 3, 4, 5, 6,
7, 8, 9, 10, 11, 12,
13
]
*/
// 4 undercore
/**
*
* @param {*} input 输入
* @param {*} shallow 是否浅拷贝
* @param {*} strict 是否严格模式
* @param {*} output 输出
*/
function undercoreFlatten(input, shallow, strict, output) {
output = output || []; // 递归的时候会用到output,和第一种resutl 一样,所以需要初始化
var idx = output.length; // 输出的长度
for (let i = 0; i < input.length; i++) {
const value = input[i]; // 遍历的当前元素
if(Array.isArray(value)) {
// 如果是数组,就递归调用
// 1. 是否浅拷贝
if(shallow) {
var j = 0;
var length = value.length;
while(j < length) {
output[idx++] = value[j++];
}
}else {
undercoreFlatten(value, shallow, strict, output)
}
}else if(!strict) {
output[idx++] = value;
}
}
return output;
}
console.log(undercoreFlatten(arr, true, true), );
console.log(undercoreFlatten(arr, false, true), );
console.log(undercoreFlatten(arr, false, false), );
console.log(undercoreFlatten(arr, true, false), );
/**
[ 5, 6, 7, [ 8, 9, [ 10, 11 ] ] ]
[]
[
1, '2', 3, 4, 5,
6, 7, 8, 9, 10,
11
]
[ 1, '2', 3, 4, 5, 6, 7, [ 8, 9, [ 10, 11 ] ] ]
*/