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 相关文章推荐
JavaScript性能陷阱小结(附实例说明)
Dec 28 Javascript
Javascript中的isNaN函数使用说明
Nov 10 Javascript
JavaScript保留两位小数的2个自定义函数
May 05 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
Oct 21 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
May 27 Javascript
Vue实现百度下拉提示搜索功能
Jun 21 Javascript
jQuery时间戳和日期相互转换操作示例
Dec 07 jQuery
JS实现计算小于非负数n的素数的数量算法示例
Feb 26 Javascript
JavaScript面试技巧之数组的一些不low操作
Mar 22 Javascript
使用js在layui中实现上传图片压缩
Jun 18 Javascript
JS实现按比例缩小图片宽高
Aug 24 Javascript
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
精通php的十大要点(上)
2009/02/04 PHP
php allow_url_include的应用和解释
2010/04/22 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
详解php用static方法的原因
2018/09/12 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
python实现zabbix发送短信脚本
2018/09/17 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
解释一下钝化(Swap out)
2016/12/26 面试题
2014年企业党建工作总结
2014/12/18 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
TypeScript 内置高级类型编程示例
2022/09/23 Javascript