数组扁平化

252 阅读1分钟

S003-数组扁平化★

// 源数组:[1, [2, [3, [4, 5]]]]
// 降维后数组:[1, 2, 3, 4, 5]

1.数组遍历 + 递归

function flutten(arr) {
  let res = [];
  arr.map(item => {
      if(Array.isArray(item)) {
        res = res.concat(flutten(item))
      } else {
        res.push(item)
      }
    })
    return res;
}

2.join + split + map (适用于里面都是数字的)

function flutten(arr) {
  arr.join(',').split(',').map(item => {
      return Number(item)
    })
}

3.toSting + split + map (适用于里面都是数字的)

function flutten(arr) {
  arr.toString().split(',').map(item => {
      return Number(item)
    })
}

4.扩展运算符

function flutten(arr) {
  while(arr.some(item => Array.isArray(item))) {
    arr = [].concat(...arr)
  }
  return arr
}

5.reduce

function flutten(arr) {
  return arr.reduce((result,item) => {
      return result.concat(Array.isArray(item)?flutten(item):item)
    },[])
}

6.正则

let result = JSON.parse('[' + JSON.stringify(arr).replace(/\[|\]/g,'') + ']')

7.使用flat

let result = arr.flat(Infinity)

这里我们详细说一下es6 新增的方法flat

es6提供的新方法flat(depth) let a = [1,[2,3]]; a.flat(); // [1,2,3] a.flat(1); //[1,2,3] flat(depth) 方法中的参数depth,代表展开嵌套数组的深度,默认是1

所以我们可以添加参数1,或者直接调用flat()来对2维数组进行扁平化,如果我们可以提前知道数组的维度,对这个数组进行扁平化处理,参数depth的值就是数组的维度减一。

let a = [1,[2,3,[4,[5]]]]; a.flat(4-1); // [1,2,3,4,5] a是4维数组 其实还有一种更简单的办法,无需知道数组的维度,直接将目标数组变成1维数组。depth的值设置为Infinity。

let a = [1,[2,3,[4,[5]]]]; a.flat(Infinity); // [1,2,3,4,5] a是4维数组

另有github每日更新精选面试题欢迎star github.com/qdleader/qd…