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 相关文章推荐
Google Dart编程语法和基本类型学习教程
Nov 27 Javascript
一段非常简单的js判断浏览器的内核
Aug 17 Javascript
使用script的src实现跨域和类似ajax效果
Nov 10 Javascript
全面解析Bootstrap手风琴效果
Apr 17 Javascript
jQuery使用$.ajax进行即时验证的方法
Dec 08 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
Sep 18 Javascript
PHP自动加载autoload和命名空间的应用小结
Dec 01 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
Sep 16 Javascript
JS操作字符串转数字的常见方法示例
Oct 29 Javascript
微信小程序音乐播放器开发
Nov 20 Javascript
javascript实现移动端触屏拖拽功能
Jul 29 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
Sep 21 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下连接mssql2005的代码
2011/01/17 PHP
开启PHP的伪静态模式
2015/12/31 PHP
做网页的一些技巧
2007/02/01 Javascript
一个javascript参数的小问题
2008/03/02 Javascript
jQuery 使用手册(六)
2009/09/23 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
js 调用百度分享功能
2017/02/27 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
Python实现的几个常用排序算法实例
2014/06/16 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
应届生体育教师自荐信
2013/10/03 职场文书
总经理助理的职责
2014/03/14 职场文书
测控技术自荐信
2014/06/05 职场文书
安全宣传标语
2014/06/10 职场文书
个人自荐书范文
2015/03/09 职场文书
《学会看病》教学反思
2016/02/17 职场文书
Nginx域名转发使用场景代码实例
2021/03/31 Servers
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS