javascript数组拍平方法总结


Posted in Javascript onJanuary 20, 2018

在开发过程中有得时候总是碰一些共性的问题,比如将一个二维数组拍平成一维数组,或者三维数组拍平成一维数组。这些问题在遇到的时候总会重新思考,不如将其提炼出来,总结一下。

下面笔者将为大家演示一下,将一个多维数组拍平成一个一维数组的两种方法,算是抛砖引玉,大家有更好的方法可以在留言区发表。

首先是第一种方法,递归处理,代码如下:

var arr = [1, 2, 3, [3, 3, 3, [5, 4, 5, 6, 6, 7, 8]],
 [333, 4444]
];
function product() {
 // 1、创建一个空数组,
 var newarr = [];
 ///2、并且返回一个函数,函数参数为要拍平的数组
 return function flatten(arr) {
  // 3、循环数组,判断每一项,不为输的话将其塞入newarr
  // 若为数组,递归调用 faltten,并将结果与newarr合并
  for (var t of arr) {
   if (!Array.isArray(t)) {
    newarr.push(t);
   } else {
    newarr.concat(flatten(t))
   }
  }
  return newarr
 }
}
var flatten = product();
console.log(flatten(arr))

执行结果为:

javascript数组拍平方法总结

上面这这种方法比较中规中矩,代码详解见注释,下面这种方法运用到了javascript语言的一些新特性,代码如下:

var arr = [1, 2, 3, [3, 3, 3, [5, 4, 5, 6, 6, 7, 8]],
 [333, 4444]
];
function flatten(arr){
 return arr.reduce(function(pre,cur){
  if(!Array.isArray(cur)){
   return [...pre,cur];
  }else{
   return [...pre,...flatten(cur)]
  }
 },[])
}
console.log(flatten(arr))

上面代码中用了ES6的一个新特性扩展云算法 “...”,“[...abc,...fff]”其作用相当于abc.concat(fff),这种用法更加直观明了,还有就是运用了reduce方法。reduce是javascript语言中数组的一个方法。

数组调用recduce方法时,可以传递两个参数,第一个参数为回调函数,第二个参数为一个初始值。回调函数中需要传递两个参数,第一个参数为每次执行函数的返回值,第二个参数为当前索引对应数组的值。reduce的第二个参数是可以省略的,省略的话,回调函数第一次调用的参数为数组的第一项和第二项的值,如果没有省略,回调函数的第一个参数就是这个初始值。上面的例子,reduce的第二个参数设置了一个空数组。

reduce的文档地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

相比来说第一种比较好理解,第二种的难点在于对reduce函数的运用和理解。

Javascript 相关文章推荐
jQuery数组处理代码详解(含实例演示)
Feb 03 Javascript
js实现兼容IE和FF的上下层的移动
May 04 Javascript
text-align:justify实现文本两端对齐 兼容IE
Aug 19 Javascript
js控制div层的叠加简单方法
Oct 15 Javascript
jQuery实现自动调用和触发某个事件的方法
Nov 18 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
原生JS发送异步数据请求
Jun 08 Javascript
解决vue移动端适配问题
Dec 12 Javascript
详解jQuery-each()方法
Mar 13 jQuery
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
May 02 Javascript
Vue中qs插件的使用详解
Feb 07 Javascript
node.js文件上传重命名以及移动位置的示例代码
Jan 19 #Javascript
详解Node.js模板引擎Jade入门
Jan 19 #Javascript
JS实现碰撞检测的方法分析
Jan 19 #Javascript
angular1配合gulp和bower的使用教程
Jan 19 #Javascript
浏览器调试动态js脚本的方法(图解)
Jan 19 #Javascript
Angular实现搜索框及价格上下限功能
Jan 19 #Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 #Javascript
You might like
php MYSQL 数据备份类
2009/06/19 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
javascript iframe编程相关代码
2009/12/28 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
python爬取51job中hr的邮箱
2016/05/14 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
深入了解Python在HDA中的应用
2019/09/05 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
如何获得EntityManager
2014/02/09 面试题
工厂会计员职责
2014/02/06 职场文书
环保公益广告语
2014/03/13 职场文书
党员教师群众路线对照检查材料思想汇报
2014/09/29 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js