数组扁平化的方式

1.利用生成器函数

function flat(tree) {
  function* iterTree(tree) {
    if (Array.isArray(tree)) {
      for (let i = 0; i < tree.length; i++) {
        yield* iterTree(tree[i]);
      }
    } else {
      yield tree;
    }
  }
  let ret = []
  for (let x of iterTree(tree)) {
    ret.push(x)
  }
  return ret
}
const tree = ['a', ['b', 'c'], ['d', 'e', ['f']]];
console.log(flat(tree))  //['a', 'b', 'c', 'd', 'e', f]

2.利用concat、es6拓展运算符、some、Array.isArray、递归、reduce

//法一
function flatArr(arr) {
//concat方法每次会拉平一层
    let newArr = [].concat(...arr);
    return newArr.some(Array.isArray) ? flatArr(newArr) : newArr;
  }

//法二
const newArr = function(arr){
   return arr.reduce(
     (pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur)
   ,[])
}

//展开特定层

const flatten = (arr, depth = 1) =>
  arr.reduce((a, v) => a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v), []);

3.遍历方法

function flattenArr (arr){
    var result=[]
    function flatten(arr){
        for (var i = 0; i < arr.length; i++) {
            if (Array.isArray(arr[i])) {
                flatten(arr[i]);
            }else{
                result.push(arr[i]);
            }        
        }
    }
    flatten(arr);
    return result;
}

 function flattenByDeep(array,deep){
      var result = [];
      for(var i = 0 ; i < array.length; i++){
          if(Array.isArray(array[i]) && deep >= 1){
                result = result.concat(flattenByDeep(array[i],deep -1))
          }else{
                result.push(array[i])
          }
      }
      return result;
  }

4.利用数组join()或toString()方法;

arr.join().split(',')
JSON.parse(`[${arr.join()}]`)
arr.toString().split(',')
JSON.parse(`[${arr.toString()}]`)
//例: 
let arr=[1, 2, [3, 4, [5, 6]]]

let newArr = flattenArr(arr) = [1, 2, 3, 4, 5, 6]

5.也可以用es6数组的flat()方法

flat方法默认打平一层嵌套,也可以接受一个参数 表示打平的层数,传 Infinity 可以打平任意层。
:es6新增方法有时候可能会失效,无法使用,这个坑我踩过,可能是浏览器版本过低不支持的原因,大部分情况下是可以使用的,自己斟酌。

[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]

[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]

[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]

//如果原数组有空位,flat()方法会跳过空位
[1, 2, , 4, 5].flat()
// [1, 2, 4, 5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值