前端练习22 数组展平

知识点

  1. concat方法可以接受数组作为参数,也可以接受非数组成员作为对象
  2. 递归
  3. reduce方法
  4. 判断数组类型
  5. flat方法

题目

编写一个JavaScript函数,接受一个仅包含数字的多维数组,返回拍平以后的结果。例如传入:[1, [2, [3, [4], 5], 6], 7],返回[1, 2, 3, 4, 5,6,7]

实现1

明显要通过递归实现,可以使用reduce方法,它可以保存当前只执行过的结果在total中,如果当前项目current仍然是数组,那么需要将递归执行的结果与total拼接

const flatDeep = (arr) => {
  if (!Array.isArray(arr) || arr.length === 0) {
    return [];
  }
  return arr.reduce((total, current) => total.concat(Array.isArray(current) ? flatDeep(current) : current), [])
};

实现2

可以不使用reduce方法,通过递归实现,构造一个闭包,通过闭包中的变量来传递结果

function flatDeep2(arr) {
  const result = [];
  (function _flat(array) {
    array.forEach(v => {
      if (Array.isArray(v)) {
        _flat(v)
      } else {
        result.push(v);
      }
    })
  })(arr);
  return result;
}

实现3

也可以不使用递归,直接使用循环实现

// ES6
function flatDeep3_1(arr) {
  const stack = [...arr];
  const result = [];
  while (stack.length > 0) {
    const target = stack.pop();
    if (Array.isArray(target)) {
      stack.push(...target);
    } else {
      result.unshift(target);
    }
  }
  return result;
}

// ES5
function flatDeep3_2(arr) {
  const stack = [].concat(arr);
  const result = [];
  while (stack.length > 0) {
    const target = stack.pop();
    if (Object.prototype.toString.call(target) === '[object Array]') {
      [].push.apply(stack, target);
    } else {
      result.unshift(target);
    }
  }
  return result;
}

实现4

还可以利用Generator实现:

function flatDeep4(arr) {
  function* _flatDeep(array) {
    for (const current of array) {
      if (Array.isArray(current)) {
        yield* _flatDeep(current);
      } else {
        yield current
      }
    }
  }
  return [..._flatDeep(arr)];
}

实现5

不考虑兼容性,还可以直接使用Array.prototype.flat(depth)方法,其中depth是要展开的深度,默认是1,传入Infinity作为深度,可以展开任意深度的嵌套数组。

要注意的是,flat()方法会移除数组中的空项

function flatDeep5(arr) {
  return arr.flat(Infinity);
}

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值