100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 什么是js数组扁平化?js数组扁平化的实现(code)

什么是js数组扁平化?js数组扁平化的实现(code)

时间:2023-08-30 13:50:49

相关推荐

什么是js数组扁平化?js数组扁平化的实现(code)

web前端|js教程

html5,javascript

web前端-js教程

本篇文章给大家带来的内容是关于什么是js数组扁平化?js数组扁平化的实现(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

千博 源码,vscode设置快捷输入,ubuntu ssd优化,tomcat怎样用,爬虫咋样,php正则表达式 日期,怀化搜狗seo优化收费,asp网站界面模板,留言板asp模板lzw

A、什么是数组扁平化

内容管理源码 .net,ubuntu在线安装原理,tomcat的配置文件名,爬虫配置代理池,php连接数据库时间不对,seo文章投稿lzw

扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁、简单,突出主题。

vs图书馆管理系统网站源码,ubuntu怎么测试联网,爬虫技术 下载网站,PHP读取转发M3U8的方法,seo怎样布局lzw

数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层的数组。

Ps:flatten可以使数组扁平化,效果就会如下:

const arr = [1, [2, [3, 4]]];console.log(flatten(arr)); // [1, 2, 3, 4]

从中可以看出,使用 flatten 处理后的数组只有一层,下面我们来试着实现一下。

B、简单实现

2.1 普通递归

这是最容易想到的方法,简单,清晰!

/* ES6 */const flatten = (arr) => { let result = []; arr.forEach((item, i, arr) => { if (Array.isArray(item)) {result = result.concat(flatten(item)); } else {result.push(arr[i]) } }) return result;};const arr = [1, [2, [3, 4]]];console.log(flatten(arr));

/* ES5 */function flatten(arr) { var result = []; for (var i = 0, len = arr.length; i < len; i++) { if (Array.isArray(arr[i])) {result = result.concat(flatten(arr[i])) } else {result.push(arr[i]) } } return result;}const arr = [1, [2, [3, 4]]];console.log(flatten(arr));

2.2 toString()

该方法是利用toString把数组变成以逗号分隔的字符串,然后遍历数组把每一项再变回原来的类型。

先来看下toString是怎么把数组变成字符串的

[1, [2, 3, [4]]].toString()// "1,2,3,4"

完整的展示

/* ES6 */const flatten = (arr) => arr.toString().split(,).map((item) => +item);const arr = [1, [2, [3, 4]]];console.log(flatten(arr));

/* ES5 */function flatten(arr) { return arr.toString().split(,).map(function(item){ return +item; });}const arr = [1, [2, [3, 4]]];console.log(flatten(arr));

这种方法使用的场景却非常有限,必须数组中元素全部都是 Number。

也可以全部都为 String,具体实现大家自己体会。

2.3 [].concat.apply + some

利用arr.some判断当数组中还有数组的话,循环调用flatten扁平函数(利用[].concat.apply扁平), 用concat连接,最终返回arr;

/* ES6 */const flatten = (arr) => { while (arr.some(item => Array.isArray(item))){ arr = [].concat.apply([], arr); } return arr;}const arr = [1, [2, [3, 4]]];console.log(flatten(arr));

/* ES5 *//*** 封装Array.some* @param {function} callback - 回调函数* @param {any}currentThis - 回调函数中this指向*/Array.prototype.some = function (callback, currentThis){ let context = this; let flag = false; currentThis = currentThis || this; for (var i = 0, len = context.length; i Array.isArray(item))){ arr = [].concat.apply([], arr); } return arr;}const arr = [1, [2, [3, 4]]];console.log(flatten(arr));

2.4 reduce

reduce本身就是一个迭代循环器,通常用于累加,所以根据这一特点有以下:

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

2.5 ES6 中的 解构运算符 …

...每次只能展开最外层的数组,被[].concat后,arr就扁平化一次。

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

相关文章推荐:

用javascript写四则元算编译器之词法分析

js滚动点击加载更多数据代码怎么实现?

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。