我也不知道为什么要整理这么多种方法, 算是拓展个思路吧。🤦?♂?
let array = [1, [2, 34, [12, 4]], 23];
1.递归遍历
function flatten1(array) {
let result = []
for (const item of array) {
if (Array.isArray(item)) {
result = result.concat(flatten1(item))
} else {
result.push(item)
}
}
return result
}
flatten1(array) // result: [ 1, 2, 34, 12, 4, 23 ]
2. Array.prototype.reduce()
- reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。
- 第一次执行回调函数时,不存在“上一次的计算结果”。如果需要回调函数从数组索引为 0 的元素开始执行,则需要传递初始值。
- 否则,数组索引为 0 的元素将被作为初始值 initialValue,迭代器将从第二个元素开始执行(索引为 1 而不是 0)。
function flatten2(array) {
let result = array.reduce((pre, current) => {
if (Array.isArray(current)) {
return pre.concat(flatten2(current))
} else {
return pre.concat(current)
}
}, [])
return result
}
flatten2(array) // result: [ 1, 2, 34, 12, 4, 23 ]
3.Array.prototype.findIndex()
- findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。
function flatten3(array) {
while (array.findIndex((item) => Array.isArray(item) > 0) !== -1) {
array = [].concat(...array)
}
return Array.from(new Set(array))
}
flatten3(array) // result: [ 1, 2, 34, 12, 4, 23 ]
4.强制类型转换
function flatten4(array) {
return array.toString().split(',').map(item => Number(item))
// 'array.toString() 转换后的结果 1,2,34,12,4,23'
}
flatten4(array) // result: [ 1, 2, 34, 12, 4, 23 ]
5.正则表达式
function flatten5(array) {
let result = JSON.stringify(array);
// JSON.stringify 转换后的结果 '[1,[2,34,[12,4]],23]'
result = result.replace(/(\[|\])/g, '');
return JSON.parse(`[${result}]`)
}
flatten5(array) // result: [ 1, 2, 34, 12, 4, 23 ]
6.栈
- 创建一个栈的结构,一个空数组,然后遍历栈结构,判断如果是数组,使用扩展运算符展开再次扔入栈中,如果不是就往新创建的数组头部增加。
function flatten6(arr) {
let res = [];
const stack = [].concat(arr);
while (stack.length > 0) {
// pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。
const item = stack.pop();
if (Array.isArray(item)) {
/**
* push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
* 用扩展运算符展开一层
*/
stack.push(...item);
} else {
// unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。
item !== undefined && res.unshift(item);
}
}
return res;
}
flatten6(array) // result: [ 1, 2, 34, 12, 4, 23 ]
7.Array.prototype.flat()
- flat(depth) 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
- depth 可选参数 指定要提取嵌套数组的结构深度,默认值为 1。
- 使用 Infinity,可展开任意深度的嵌套数组
function flatten7(array){
return array.flat(Infinity)
}
flatten7(array) // result: [ 1, 2, 34, 12, 4, 23 ]
|