实现数组扁平化的几种方式

打印 上一主题 下一主题

主题 1044|帖子 1044|积分 3132

目标: 实现数组扁平化[1,[2,[3,4,5]]] ==> [1,2,3,4,5]
我们有几种方法可以实现,分别为:
1、递归
  1. function flatten(list){
  2.         return list.reduce((tar, cur) => {
  3.                 if(Array.isArray(cur)){
  4.                         tar = tar.concat(flatten(cur));
  5.                 } else {
  6.                         tar.push(cur);
  7.                 }
  8.                 return tar;
  9.         }, []);
  10. }
  11. flatten([1,[2,[3,4,5]]]) // [1, 2, 3, 4, 5]
复制代码
递归的方法就是不停归并数组中是数组的元素,这里问题不大,这个方法适用于布局相对简单的数据,如果数据量特别的大,使用递归的话,回应性性能
2、toString方法
  1. function flatten(list){
  2.     let str = list.toString();
  3.     return str.split(',').map(item => +item);
  4. }
  5. flatten([1,[2,[3,4,5]]]) // [1, 2, 3, 4, 5]
复制代码
使用toString方法可以将数组转化为数组内部元素的字符串,然后针对该字符串返回扁平化的数组,只是这种方法如果遇到包含对象的数组就不行了
3、正则表达式结合JSON
  1. function flatten(list){
  2.     let newStr = JSON.stringify(list).replace(/\[|\]/g, '');
  3.     return JSON.parse(`[${newStr}]`);
  4. }
  5. flatten([1,[2,[3,4,5]]]) // [1, 2, 3, 4, 5]
复制代码
这个办法同样适用于布局相对简单的数组,如果遇到包含对象的数组就不行了
4、终极武器flat
  1. [1,100,[2,[3,4,5]]].flat(3) // [1, 100, 2, 3, 4, 5]
复制代码
使用数组的flat方法可以实现数组的扁平化
flat() 方法创建一个新的数组,并根据指定深度递归地将全部子数组元素拼接到新的数组中。
flat传入的参数,指定要提取嵌套数组的布局深度,默认值为 1。
假使,我们不知道深度是多少的情况下,可以传入Infinity
  1. [1,100,[2,[3,4,5]]].flat(Infinity) // [1, 100, 2, 3, 4, 5]
复制代码
另外,使用flat() 方法会忽略数组中的空槽。
  1. [1,2,,3,,,,6].flat() // [1,2,3,6]
复制代码
所以,使用这个特性,我们还可以用它来删除数组的空槽数据哈!
记住吧!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表