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 相关文章推荐
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
node.js中的fs.exists方法使用说明
Dec 17 Javascript
Javascript核心读书有感之类型、值和变量
Feb 11 Javascript
JavaScript常用脚本汇总(二)
Mar 04 Javascript
7个jQuery最佳实践
Jan 12 Javascript
轻松学习Javascript闭包
Mar 01 Javascript
Vue.js中数据绑定的语法教程
Jun 02 Javascript
vue微信分享 vue实现当前页面分享其他页面
Dec 02 Javascript
Echarts地图添加引导线效果(labelLine)
Sep 30 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
Oct 16 Javascript
Vue中computed及watch区别实例解析
Aug 01 Javascript
原生JS实现九宫格抽奖
Sep 13 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
奉献演讲稿范文
2014/05/21 职场文书
法学自荐信
2014/06/20 职场文书
法人委托书范本
2014/09/15 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
spring boot实现文件上传
2022/08/14 Java/Android