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 相关文章推荐
Javascript与flash交互通信基础教程
Aug 07 Javascript
jQuery Validation插件remote验证方式的Bug解决
Jul 01 Javascript
js定时器(执行一次、重复执行)
Mar 07 Javascript
jquery attr方法获取input的checked属性问题
May 26 Javascript
jQuery中parents()和parent()的区别分析
Oct 28 Javascript
javascript中的遍历for in 以及with的用法
Dec 22 Javascript
Javascript的表单与验证-非空验证
Mar 18 Javascript
Node.js connect ECONNREFUSED错误解决办法
Sep 15 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
Oct 04 Javascript
Bootstrap4如何定制自己的颜色和风格
Feb 26 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
Vuex的API文档说明详解
Feb 05 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获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
joomla组件开发入门教程
2016/05/04 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
jQuery选择器源码解读(一):Sizzle方法
2015/03/31 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
Python单链表的简单实现方法
2014/09/23 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python跳出双层for循环的解决方法
2019/06/24 Python
Python数组并集交集补集代码实例
2020/02/18 Python
python如何更新包
2020/06/11 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
企业宣传标语
2014/06/09 职场文书
2014年电工工作总结
2014/11/20 职场文书
学前班学生评语
2014/12/29 职场文书
晚会开幕词
2015/01/28 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
单身证明格式样本
2015/06/15 职场文书