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 相关文章推荐
前台js改变Session的值(用ajax实现)
Dec 28 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
Nov 22 Javascript
jquery简单图片切换显示效果实现方法
Jan 14 Javascript
javascript实现画不相交的圆
Apr 07 Javascript
js省市联动效果完整实例代码
Dec 09 Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 Javascript
Vue动态实现评分效果
May 24 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
Jan 05 Javascript
详解Vue取消eslint语法限制
Aug 04 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 07 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
Nov 02 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
js常用排序实现代码
2010/12/28 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
Python简单进程锁代码实例
2015/04/27 Python
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
pandas对指定列进行填充的方法
2018/04/11 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Python Lambda函数使用总结详解
2019/12/11 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
乡镇信息公开实施方案
2014/03/23 职场文书
2014年营销工作总结
2014/11/22 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
使用CSS实现音波加载效果
2023/05/07 HTML / CSS