JavaScript实现数组降维详解


Posted in Javascript onJanuary 05, 2017

二维数组降维

二维数组只有两个维度,降维比较简单,也不用考虑太复杂的算法逻辑,我们看一下二维数组降维的几种方法;

遍历降维

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = [];
for (var r = 0; r < arr.length; r++) {
  for (var c = 0; c < arr[r].length; c++) {
    result.push(arr[r][c]);
  }
}
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

此方法思路简单,利用双重循环遍历二维数组中的每个元素并放到新数组中。

使用concat

利用concat方法,可以将双重循环简化为单重循环:

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = [];
for (var r = 0, result = []; r < arr.length; r++) {
  result = result.concat(arr[r]);
}
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

arr的每一个元素都是一个数组或参数,作为concat方法的参数,数组中的参数或每一个子元素又都会被独立插入进新数组。

使用apply+concat

apply方法会调用一个函数,apply方法的第一个参数会作为被调用函数的this值,apply方法的第二个参数(一个数组,或类数组的对象)会作为被调用对象的arguments值,也就是说该数组的各个元素将会依次成为被调用函数的各个参数;

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = Array.prototype.concat.apply([], arr);
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

利用apply方法,只需要一行代码就可以完成二维数组降维了。

多维数组降维

多维数组就没二维数组那么简单了,因为不确定数组的深度,所以也不能进行遍历来降维,只能通过递归或者栈方法来实现。

递归

Array.prototype.deepFlatten = function() {
  var result = []; //定义保存结果的数组
  this.forEach(function(val, idx) { //遍历数组
    if (Array.isArray(val)) { //判断是否为子数组
      val.forEach(arguments.callee); //为子数组则递归执行
    } else {
      result.push(val); //不为子数组则将值存入结果数组中
    }
  });
  return result; //返回result数组
}
var arr = [2, 3, [2, 2],
  [3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

这是通过递归的方法实现了多维数组的降维,在这里面,我有使用了原型链将方法封装进了Array原型中,可以直接在数组方法中调用。

栈方法

Array.prototype.deepFlatten = function() {
  var result = []; //定义保存结果的数组
  var stack = this; //将数组放入栈中
  while (stack.length !== 0) { //如果栈不为空,则循环遍历
    var val = stack.pop(); //取出最后一个值
    if (Array.isArray(val)) { //判断是不是数组
      stack = stack.concat(val); //如果是数组就将拼接入栈中
    } else {
      result.unshift(val); //如果不是数组就将其取出来放入结果数组中
    }
  }
  return result;
}
var arr = [2, 3, [2, 2],
  [3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

这是通过栈方法,建立了一个栈,将数组的内容存进去,然后逐个取出来,如果取出来的是个数组,就将这个数组打散拼接进栈中,在出栈一个,这样循环。

多维数组降维的方法也可以降维二维数组,但是有点大材小用,还是用对的方法做对的事才是最好的!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jQuery getJSON 处理json数据的代码
Jul 26 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
js 与 php 通过json数据进行通讯示例
Mar 26 Javascript
JS实现距离上次刷新已过多少秒示例
May 23 Javascript
jQuery Masonry瀑布流插件使用详解
Nov 17 Javascript
jquery仿百度经验滑动切换浏览效果
Apr 14 Javascript
微信小程序 引入es6 promise
Apr 12 Javascript
Bootstrap fileinput文件上传组件使用详解
Jun 06 Javascript
js实现上传并压缩图片效果
Jan 10 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
Jan 16 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
Oct 31 Javascript
小程序实现页面顶部选项卡效果
Nov 06 Javascript
jQuery解析返回的xml和json方法详解
Jan 05 #Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
Jan 05 #Javascript
jQuery实现动态文字搜索功能
Jan 05 #Javascript
JS实现HTML标签转义及反转义
Apr 14 #Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 #Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 #Javascript
如何提高Dom访问速度
Jan 05 #Javascript
You might like
php函数的常用方法及注意之处小结
2011/07/10 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
json 定义
2008/06/10 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Python中类的初始化特殊方法
2017/12/01 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
对python中dict和json的区别详解
2018/12/18 Python
详解Python_shutil模块
2019/03/15 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
python打开使用的方法
2019/09/30 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
python实现粒子群算法
2020/10/15 Python
30年同学聚会感言
2014/01/30 职场文书
好员工观后感
2015/06/17 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
MySQL8.0的WITH查询详情
2021/08/30 MySQL
SpringBoot Http远程调用的方法
2022/08/14 Java/Android