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 浏览器关闭事件
Jul 08 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
Jul 10 Javascript
js中符号转意问题示例探讨
Aug 19 Javascript
调用jQuery滑出效果时闪烁的解决方法
Mar 27 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
基于JavaScript实现定时跳转到指定页面
Jan 01 Javascript
基于jquery实现的鼠标悬停提示案例
Dec 11 Javascript
深入理解Commonjs规范及Node模块实现
May 17 Javascript
Vue.js在数组中插入重复数据的实现代码
Nov 17 Javascript
web前端vue实现插值文本和输出原始html
Jan 19 Javascript
JS获取指定月份的天数两种实现方法
Jun 22 Javascript
VUE项目中加载已保存的笔记实例方法
Sep 14 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
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
php判断目录存在的简单方法
2019/09/26 PHP
javascript标签在页面中的位置探讨
2013/04/11 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
python实现定时播放mp3
2015/03/29 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
python3 enum模块的应用实例详解
2019/08/12 Python
Python实现验证码识别
2020/06/15 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
俄语专业毕业生推荐信
2013/10/28 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
优秀班集体申报材料
2014/12/25 职场文书
歼十出击观后感
2015/06/11 职场文书
Linux中如何安装并部署Redis
2022/04/18 Servers