目录
- 栈的方式
- reduce + 递归 的方式
- 遍历方式
一、栈的方式
while
+(原始数据:concat成栈,后pop + 若item是数组则push)
+(否则:结果数组unshift)
,得到最终铺平的数组
// 栈思想
function flat(arr) {
const result = [];
const stack = [].concat(arr); // 将数组元素拷贝至栈,直接赋值会改变原数组
//如果栈不为空,则循环遍历
while (stack.length !== 0) {
const val = stack.pop(); // 尾部弹出
if (Array.isArray(val)) {
stack.push(...val); //如果是数组再次入栈,并且展开了一层, 并且从尾部推入
} else {
result.unshift(val); //如果不是数组就将其取出来放入结果数组中,
// 从头部插入,第一个插入的实际为result的最后一个。
// 最后一个插入头部的实际为第一个。这就做到了尾部的还在尾部,头部的还在头部。
}
}
return result;
}
const arr = [1, 2, 3,[4,[5]],6]
flat(arr);// [1, 2, 3, 4, 5, 6]
复制代码
二、reduce方式+递归
递归 concat可以铺平一级数组
function flat(arr){
return arr.reduce((pre, cur)=> pre.concat(Array.isArray(cur) ? flat(cur) : cur), [])
};
const arr = [1, 2, 3,[4,[5]],6]
flat(arr);// [1, 2, 3, 4, 5, 6]
复制代码
三、 遍历方式 map 或者 forEach
function flat1(arr){
let res = [];
arr.map((item,index)=>{ // arr.forEach一样可以
if(Array.isArray(item)){
res = res.concat(flat1(item));// concat的返回值才是组合后的数组。concat不改变原始数据
}else{
res.push(item); // push的返回值是数组的长度,一般没用。push会改变原始数据。
}
})
return res;
}
const arr = [1, 2, 3,[4,[5]],6]
flat1(arr)
// [1, 2, 3, 4, 5, 6]
复制代码
总结
- 栈的方式:
while
+(原始数据:concat成栈,后pop + 若item是数组则push)
+(否则:结果数组unshift)
,得到最终铺平的数组
- concat的返回值才是组合后的数组。concat不改变原始数据
- push的返回值是数组的长度,一般没用。push会改变原始数据。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END