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控制listbox中项的移动并排序的实现代码
Sep 28 Javascript
基于jQuery的history历史记录插件
Dec 11 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
Jan 07 Javascript
JavaScript中rem布局在react中的应用
Dec 09 Javascript
javascript运算符——逻辑运算符全面解析
Jun 27 Javascript
利用jquery实现下拉框的禁用与启用
Dec 07 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
Sep 10 jQuery
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
Apr 11 Javascript
js tab栏切换代码实例解析
Sep 03 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
Dec 17 Javascript
JavaScript实现表单验证功能
Dec 09 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
截获网站title标签之家内容的例子
2006/10/09 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
Vue 组件的挂载与父子组件的传值实例
2020/09/02 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
自荐书范文
2013/12/08 职场文书
毕业生自荐书
2013/12/18 职场文书
幼儿教师国培感言
2014/02/19 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
保护环境倡议书300字
2014/05/19 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
离婚纠纷代理词
2015/05/23 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android