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 相关文章推荐
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
Oct 26 Javascript
基于jquery的页面划词搜索JS
Sep 14 Javascript
遍历DOM对象内的元素属性示例代码
Feb 08 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
Mar 05 Javascript
使用Node.js实现HTTP 206内容分片的教程
Jun 23 Javascript
Bootstrap的modal拖动效果
Dec 25 Javascript
Angular实现预加载延迟模块的示例
Oct 12 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
使用async await 封装 axios的方法
Jul 09 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
May 22 Javascript
微信小程序实现日期格式化和倒计时
Nov 01 Javascript
vue 页面跳转的实现方式
Jan 12 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
php中addslashes函数与sql防注入
2014/11/17 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
Python树莓派学习笔记之UDP传输视频帧操作详解
2019/11/15 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
Born鞋子官网:Born Shoes
2017/04/06 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
超市营业员岗位职责
2013/12/20 职场文书
建筑专业自荐信范文
2014/01/05 职场文书
上班早退检讨书
2014/01/09 职场文书
成考报名单位证明范本
2014/01/16 职场文书
高中毕业自我评价
2014/02/08 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
宇宙与人观后感
2015/06/05 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python
MySQL常用慢查询分析工具详解
2022/08/14 MySQL