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 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
javascript IFrame 强制刷新代码
Jul 23 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
Jun 11 Javascript
js显示时间 js显示最后修改时间
Jan 02 Javascript
jquery对单选框,多选框,文本框等常见操作小结
Jan 08 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
Sep 22 Javascript
Javascript基础教程之数据类型 (数值 Number)
Jan 18 Javascript
jquery实现下拉框左右选择功能
Feb 21 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
May 30 Javascript
node.js中 redis 的安装和基本操作示例
Feb 10 Javascript
为react组件库添加typescript类型提示的方法
Jun 15 Javascript
Vue实现简单计算器
Jan 20 Vue.js
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 多进程 解决难题
2009/06/22 PHP
YII路径的用法总结
2014/07/09 PHP
详解PHP数组赋值方法
2015/11/07 PHP
自制PHP框架之设计模式
2017/05/07 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
php实现等比例压缩图片
2018/07/26 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
Django中对数据查询结果进行排序的方法
2015/07/17 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
python excel和yaml文件的读取封装
2021/01/12 Python
Python datetime模块的使用示例
2021/02/02 Python
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
厨师岗位职责
2013/11/12 职场文书
护士自我评价范文
2014/01/25 职场文书
医学求职信
2014/05/28 职场文书
三严三实学习心得体会
2014/10/13 职场文书
就业推荐表导师评语
2014/12/31 职场文书
运动会广播稿50字
2015/08/19 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书