Skip to content
On this page

实现数组拍平

js
Array.prototype.flat = function(){
    const res = this.map(item => {
        if(Array.isArray(item)){
            return item.flat()
        } else {
            return [item]
        }
    })
    return [].concat(...res)
}

// 使用 reduce、concat 和递归展开无限多层嵌套的数组
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
Array.prototype.flat = function(){
  return this.reduce((pre, cur)=>{
    return pre.concat(Array.isArray(cur)? cur.flat() : cur)
  }, [])
}
arr1.flat();
// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]

// forEach 遍历数组会自动跳过空元素
const eachFlat = (arr = [], depth = 1) => {
  const result = []; // 缓存递归结果
  // 开始递归
  (function flat(arr, depth) {
    // forEach 会自动去除数组空位
    arr.forEach((item) => {
      // 控制递归深度
      if (Array.isArray(item) && depth > 0) {
        // 递归数组
        flat(item, depth - 1)
      } else {
        // 缓存元素
        result.push(item)
      }
    })
  })(arr, depth)
  // 返回递归结果
  return result;
}
eachFlat(arr1, Infinity);

// Use Generator function
function* flatten(array) {
    for (const item of array) {
        if (Array.isArray(item)) {
            yield* flatten(item);
        } else {
            yield item;
        }
    }
}

var arr = [1, 2, [3, 4, [5, 6]]];
const flattened = [...flatten(arr)];
// [1, 2, 3, 4, 5, 6]

Released under the MIT License.