当前位置: 首页 > news >正文

15.实现数组的扁平化

实现方式1(递归)

普通的递归思路很容易理解,就是通过循环递归的方式,一项一项地去遍历,如果每一项还是一个数组,那么就继续往下遍历,利用递归程序的方法,来实现数组的每一项的连接:

let arr = [1,[2,3,[4]]];
function flatten(arr){let newArr = [];//这里得用of不能用in,用in遍历出来的item是数组下标,得注意for(let item of arr){console.log(item);//Array.isArray()是一个安全的函数if(Array.isArray(item)){//concat函数返回一个新数组newArr = newArr.concat(flatten(item));}else {newArr.push(item);}}return newArr;
}console.log(flatten(arr));

实现方式2(reduce)

let arr = [1,[2,3,[4]]];
function flatten(arr){return arr.reduce(function(pre,current){return pre.concat(Array.isArray(current) ? flatten(current) : current)},[])
}console.log(flatten(arr));

实现方式3(扩展运算符)

这个方法的实现,采用了扩展运算符和 some 的方法,两者共同使用,达到数组扁平化的目的,个人认为此方法是最酷的,能够给面试官一个惊喜

let arr = [1,[2,[3,4]]];
function flatten(arr){while(arr.some(item => Array.isArray(item))){console.log(arr);arr = [].concat(...arr)}return arr;
}console.log(flatten(arr));

实现方式4

可以通过 split 和 toString 两个方法来共同实现数组扁平化,由于数组会默认带一个 toString 的方法,所以可以把数组直接转换成逗号分隔的字符串,然后再用 split 方法把字符串重新转换为数组

let arr = [1, [2, [3, 4]]];
function flatten(arr) {return arr.toString().split(',');
}
console.log(flatten(arr)); //  [1, 2, 3, 4,5]

实现方式5(ES6新增函数flat)

我们还可以直接调用 ES6 中的 flat 方法来实现数组扁平化。flat 方法的语法:arr.flat([depth])

其中 depth 是 flat 的参数,depth 是可以传递数组的展开深度(默认不填、数值是 1),即展开一层数组。如果层数不确定,参数可以传进 Infinity,代表不论多少层都要展开:

let arr = [1, [2, [3, 4]]];
function flatten(arr) {return arr.flat(Infinity);
}
console.log(flatten(arr)); //  [1, 2, 3, 4,5]

实现方式6(正则表达式)

(6)正则和 JSON 方法 在第4种方法中已经使用 toString 方法,其中仍然采用了将 JSON.stringify 的方法先转换为字符串,然后通过正则表达式过滤掉字符串中的数组的方括号,最后再利用 JSON.parse 把它转换成数组:

let arr = [1, [2, [3, [4, 5]]], 6];
function flatten(arr) {let str = JSON.stringify(arr);console.log(str);//[1,[2,[3,[4,5]]],6],字符串str = str.replace(/(\[|\])/g, '');console.log(str);//1,2,3,4,5,6str = '[' + str + ']';console.log(str);//[1,2,3,4,5,6]return JSON.parse(str); 
}
console.log(flatten(arr)); //  [1, 2, 3, 4,5]

http://www.lryc.cn/news/297692.html

相关文章:

  • 对话模型Demo解读(使用代码解读原理)
  • Android 自定义BaseFragment
  • [C#] 如何对列表,字典等进行排序?
  • Mac 下载安装Java、maven并配置环境变量
  • 【多模态】27、Vary | 通过扩充图像词汇来提升多模态模型在细粒度感知任务(OCR等)上的效果
  • |Python新手小白低级教程|第二十章:函数(2)【包括石头剪刀布判断程序(模拟版)】
  • vue3 之 商城项目—home
  • git flow与分支管理
  • 【Linux】学习-进程信号
  • webgis后端安卓系统部署攻略
  • 【数据分享】1929-2023年全球站点的逐日平均风速数据(Shp\Excel\免费获取)
  • 【多模态大模型】视觉大模型SAM:如何使模型能够处理任意图像的分割任务?
  • Shell之sed
  • AJAX——认识URL
  • 《Docker极简教程》--Docker环境的搭建--在Linux上搭建Docker环境
  • 开源微服务平台框架的特点是什么?
  • C#系列-C#操作UDP发送接收数据(10)
  • 突破编程_C++_面试(基础知识(10))
  • 初步探索Pyglet库:打造轻量级多媒体与游戏开发利器
  • 【npm】安装全局包,使用时提示:不是内部或外部命令,也不是可运行的程序或批处理文件
  • Go 语言 for 的用法
  • 熵权法Python代码实现
  • 浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决
  • 使用深度学习进行“序列到序列”分类
  • Python和Java的区别(不断更新)
  • Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)
  • vue electron 应用在windows系统上以管理员权限打开应用
  • c实现链表
  • 力扣231. 2 的幂(数学,二分查找,位运算)
  • Maven私服部署与JAR文件本地安装